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	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}