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