services.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package app
  2. import (
  3. "context"
  4. "database/sql"
  5. "github.com/kujtimiihoxha/termai/internal/config"
  6. "github.com/kujtimiihoxha/termai/internal/db"
  7. "github.com/kujtimiihoxha/termai/internal/logging"
  8. "github.com/kujtimiihoxha/termai/internal/lsp"
  9. "github.com/kujtimiihoxha/termai/internal/lsp/watcher"
  10. "github.com/kujtimiihoxha/termai/internal/message"
  11. "github.com/kujtimiihoxha/termai/internal/permission"
  12. "github.com/kujtimiihoxha/termai/internal/session"
  13. )
  14. type App struct {
  15. Context context.Context
  16. Sessions session.Service
  17. Messages message.Service
  18. Permissions permission.Service
  19. LSPClients map[string]*lsp.Client
  20. }
  21. func New(ctx context.Context, conn *sql.DB) *App {
  22. cfg := config.Get()
  23. logging.Info("Debug mode enabled")
  24. q := db.New(conn)
  25. sessions := session.NewService(ctx, q)
  26. messages := message.NewService(ctx, q)
  27. app := &App{
  28. Context: ctx,
  29. Sessions: sessions,
  30. Messages: messages,
  31. Permissions: permission.NewPermissionService(),
  32. LSPClients: make(map[string]*lsp.Client),
  33. }
  34. for name, client := range cfg.LSP {
  35. lspClient, err := lsp.NewClient(ctx, client.Command, client.Args...)
  36. workspaceWatcher := watcher.NewWorkspaceWatcher(lspClient)
  37. if err != nil {
  38. logging.Error("Failed to create LSP client for", name, err)
  39. continue
  40. }
  41. _, err = lspClient.InitializeLSPClient(ctx, config.WorkingDirectory())
  42. if err != nil {
  43. logging.Error("Initialize failed", "error", err)
  44. continue
  45. }
  46. go workspaceWatcher.WatchWorkspace(ctx, config.WorkingDirectory())
  47. app.LSPClients[name] = lspClient
  48. }
  49. return app
  50. }