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