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