services.go

 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}