services.go

 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}