services.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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/pubsub"
  13. "github.com/kujtimiihoxha/termai/internal/session"
  14. "github.com/kujtimiihoxha/termai/internal/tui/util"
  15. )
  16. type App struct {
  17. Context context.Context
  18. Sessions session.Service
  19. Messages message.Service
  20. Permissions permission.Service
  21. LSPClients map[string]*lsp.Client
  22. Logger logging.Interface
  23. Status *pubsub.Broker[util.InfoMsg]
  24. ceanups []func()
  25. }
  26. func New(ctx context.Context, conn *sql.DB) *App {
  27. cfg := config.Get()
  28. q := db.New(conn)
  29. log := logging.NewLogger(logging.Options{
  30. Level: cfg.Log.Level,
  31. })
  32. sessions := session.NewService(ctx, q)
  33. messages := message.NewService(ctx, q)
  34. app := &App{
  35. Context: ctx,
  36. Sessions: sessions,
  37. Messages: messages,
  38. Permissions: permission.NewPermissionService(),
  39. Logger: log,
  40. Status: pubsub.NewBroker[util.InfoMsg](),
  41. LSPClients: make(map[string]*lsp.Client),
  42. }
  43. for name, client := range cfg.LSP {
  44. lspClient, err := lsp.NewClient(client.Command, client.Args...)
  45. app.ceanups = append(app.ceanups, func() {
  46. lspClient.Close()
  47. })
  48. workspaceWatcher := watcher.NewWorkspaceWatcher(lspClient)
  49. if err != nil {
  50. log.Error("Failed to create LSP client for", name, err)
  51. continue
  52. }
  53. _, err = lspClient.InitializeLSPClient(ctx, config.WorkingDirectory())
  54. if err != nil {
  55. log.Error("Initialize failed", "error", err)
  56. continue
  57. }
  58. go workspaceWatcher.WatchWorkspace(ctx, config.WorkingDirectory())
  59. app.LSPClients[name] = lspClient
  60. }
  61. return app
  62. }
  63. func (a *App) Close() {
  64. for _, cleanup := range a.ceanups {
  65. cleanup()
  66. }
  67. for _, client := range a.LSPClients {
  68. client.Close()
  69. }
  70. a.Logger.Info("App closed")
  71. }