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.NewLogger(logging.Options{
35 Level: cfg.Log.Level,
36 })
37 sessions := session.NewService(ctx, q)
38 messages := message.NewService(ctx, q)
39
40 app := &App{
41 Context: ctx,
42 Sessions: sessions,
43 Messages: messages,
44 Permissions: permission.Default,
45 Logger: log,
46 LSPClients: make(map[string]*lsp.Client),
47 }
48
49 for name, client := range cfg.LSP {
50 lspClient, err := lsp.NewClient(client.Command, client.Args...)
51 app.ceanups = append(app.ceanups, func() {
52 lspClient.Close()
53 })
54 workspaceWatcher := watcher.NewWorkspaceWatcher(lspClient)
55 if err != nil {
56 log.Error("Failed to create LSP client for", name, err)
57 continue
58 }
59
60 _, err = lspClient.InitializeLSPClient(ctx, config.WorkingDirectory())
61 if err != nil {
62 log.Error("Initialize failed", "error", err)
63 continue
64 }
65 go workspaceWatcher.WatchWorkspace(ctx, config.WorkingDirectory())
66 app.LSPClients[name] = lspClient
67 }
68 return app
69}
70
71func (a *App) Close() {
72 for _, cleanup := range a.ceanups {
73 cleanup()
74 }
75 for _, client := range a.LSPClients {
76 client.Close()
77 }
78 a.Logger.Info("App closed")
79}