services.go 1.8 KB

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