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