summaryrefslogtreecommitdiff
path: root/internal/hexailsp/dependencies.go
blob: 7e025d4c66d3f1156d3312ea7953c4e6697a3b71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package hexailsp

import (
	"log"

	"codeberg.org/snonux/hexai/internal/appconfig"
	"codeberg.org/snonux/hexai/internal/ignore"
	"codeberg.org/snonux/hexai/internal/llm"
	"codeberg.org/snonux/hexai/internal/llmutils"
	"codeberg.org/snonux/hexai/internal/logging"
	"codeberg.org/snonux/hexai/internal/lsp"
	"codeberg.org/snonux/hexai/internal/runtimeconfig"
)

type configLoader func(*log.Logger, appconfig.LoadOptions) appconfig.App

type clientBuilder func(appconfig.App, llm.Client) llm.Client

type configStoreFactory func(appconfig.App) *runtimeconfig.Store

type ignoreCheckerFactory func(appconfig.App) *ignore.Checker

type runDependencies struct {
	loadConfig       configLoader
	buildClient      clientBuilder
	newConfigStore   configStoreFactory
	newIgnoreChecker ignoreCheckerFactory
	statusSink       lsp.StatusSink
}

func defaultRunDependencies() runDependencies {
	return runDependencies{
		loadConfig:       appconfig.LoadWithOptions,
		buildClient:      defaultClientBuilder,
		newConfigStore:   runtimeconfig.New,
		newIgnoreChecker: defaultIgnoreCheckerFactory,
		statusSink:       tmuxStatusSink{},
	}
}

func normalizeRunDependencies(deps runDependencies) runDependencies {
	if deps.loadConfig == nil {
		deps.loadConfig = appconfig.LoadWithOptions
	}
	if deps.buildClient == nil {
		deps.buildClient = defaultClientBuilder
	}
	if deps.newConfigStore == nil {
		deps.newConfigStore = runtimeconfig.New
	}
	if deps.newIgnoreChecker == nil {
		deps.newIgnoreChecker = defaultIgnoreCheckerFactory
	}
	if deps.statusSink == nil {
		deps.statusSink = tmuxStatusSink{}
	}
	return deps
}

func defaultClientBuilder(cfg appconfig.App, client llm.Client) llm.Client {
	if client != nil {
		return client
	}
	c, err := llmutils.NewClientFromApp(cfg)
	if err != nil {
		logging.Logf("lsp ", "llm disabled: %v", err)
		return nil
	}
	logging.Logf("lsp ", "llm enabled provider=%s model=%s", c.Name(), c.DefaultModel())
	return c
}

func defaultIgnoreCheckerFactory(cfg appconfig.App) *ignore.Checker {
	gitRoot := appconfig.FindGitRoot()
	useGI := cfg.IgnoreGitignore == nil || *cfg.IgnoreGitignore
	return ignore.New(gitRoot, useGI, cfg.IgnoreExtraPatterns)
}