opencode/internal/app/services.go

84 lines
2.0 KiB
Go
Raw Normal View History

2025-03-24 02:19:08 +08:00
package app
import (
"context"
"database/sql"
2025-03-28 05:35:48 +08:00
"github.com/kujtimiihoxha/termai/internal/config"
2025-03-24 02:19:08 +08:00
"github.com/kujtimiihoxha/termai/internal/db"
"github.com/kujtimiihoxha/termai/internal/logging"
2025-04-03 21:20:15 +08:00
"github.com/kujtimiihoxha/termai/internal/lsp"
"github.com/kujtimiihoxha/termai/internal/lsp/watcher"
2025-03-24 05:25:31 +08:00
"github.com/kujtimiihoxha/termai/internal/message"
2025-03-25 20:04:36 +08:00
"github.com/kujtimiihoxha/termai/internal/permission"
2025-04-08 01:43:31 +08:00
"github.com/kujtimiihoxha/termai/internal/pubsub"
2025-03-24 02:19:08 +08:00
"github.com/kujtimiihoxha/termai/internal/session"
2025-04-08 01:43:31 +08:00
"github.com/kujtimiihoxha/termai/internal/tui/util"
2025-03-24 02:19:08 +08:00
)
type App struct {
Context context.Context
2025-03-25 20:04:36 +08:00
Sessions session.Service
Messages message.Service
Permissions permission.Service
2025-03-24 02:19:08 +08:00
2025-04-03 21:20:15 +08:00
LSPClients map[string]*lsp.Client
2025-03-24 02:19:08 +08:00
Logger logging.Interface
2025-04-03 21:20:15 +08:00
2025-04-08 01:43:31 +08:00
Status *pubsub.Broker[util.InfoMsg]
2025-04-03 21:20:15 +08:00
ceanups []func()
2025-03-24 02:19:08 +08:00
}
func New(ctx context.Context, conn *sql.DB) *App {
2025-04-03 21:20:15 +08:00
cfg := config.Get()
2025-03-24 02:19:08 +08:00
q := db.New(conn)
log := logging.NewLogger(logging.Options{
2025-04-03 21:20:15 +08:00
Level: cfg.Log.Level,
2025-03-24 02:19:08 +08:00
})
2025-03-24 05:25:31 +08:00
sessions := session.NewService(ctx, q)
messages := message.NewService(ctx, q)
2025-04-03 21:20:15 +08:00
app := &App{
2025-03-25 20:04:36 +08:00
Context: ctx,
Sessions: sessions,
Messages: messages,
Permissions: permission.NewPermissionService(),
2025-03-25 20:04:36 +08:00
Logger: log,
2025-04-08 01:43:31 +08:00
Status: pubsub.NewBroker[util.InfoMsg](),
2025-04-03 21:20:15 +08:00
LSPClients: make(map[string]*lsp.Client),
}
for name, client := range cfg.LSP {
lspClient, err := lsp.NewClient(client.Command, client.Args...)
app.ceanups = append(app.ceanups, func() {
lspClient.Close()
})
workspaceWatcher := watcher.NewWorkspaceWatcher(lspClient)
if err != nil {
log.Error("Failed to create LSP client for", name, err)
continue
}
_, err = lspClient.InitializeLSPClient(ctx, config.WorkingDirectory())
if err != nil {
log.Error("Initialize failed", "error", err)
continue
}
go workspaceWatcher.WatchWorkspace(ctx, config.WorkingDirectory())
app.LSPClients[name] = lspClient
2025-03-24 02:19:08 +08:00
}
2025-04-03 21:20:15 +08:00
return app
2025-03-24 02:19:08 +08:00
}
2025-03-28 05:35:48 +08:00
2025-04-03 21:20:15 +08:00
func (a *App) Close() {
for _, cleanup := range a.ceanups {
cleanup()
}
for _, client := range a.LSPClients {
client.Close()
}
a.Logger.Info("App closed")
}