all repos

clerk @ 6106d588c3cc8b0aa2d551af7c80a0e8268ae14a

missing tooling for ledger/hledger

clerk/internal/lsp/lsp.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: diagnostics, 19 days ago
1
package lsp
2
3
import (
4
	"context"
5
	"io"
6
	"log/slog"
7
	"os"
8
9
	"go.lsp.dev/jsonrpc2"
10
	"go.lsp.dev/protocol"
11
	"go.lsp.dev/uri"
12
13
	"olexsmir.xyz/clerk/internal/linter"
14
	"olexsmir.xyz/clerk/journal"
15
	"olexsmir.xyz/clerk/journal/printer"
16
)
17
18
type Server struct{ server *server }
19
20
func NewServer(version string) *Server {
21
	return &Server{
22
		server: &server{
23
			version:  version,
24
			openDocs: make(map[uri.URI]docState),
25
26
			loader:     journal.NewLoader(),
27
			linter:     linter.NewLinter(linter.Rules),
28
			printerCfg: printer.DefaultConfig,
29
30
			logger: slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{})),
31
		},
32
	}
33
}
34
35
func (s *Server) Run(ctx context.Context, stdin io.ReadCloser, stdout io.WriteCloser) error {
36
	stream := jsonrpc2.NewStream(readWriterCloser{
37
		Reader: stdin,
38
		Writer: stdout,
39
		Closer: stdin,
40
	})
41
42
	_, conn, client := protocol.NewServer(ctx, s.server, stream)
43
	defer conn.Close()
44
45
	s.server.client = client
46
47
	<-conn.Done()
48
	return conn.Err()
49
}
50
51
type readWriterCloser struct {
52
	io.Reader
53
	io.Writer
54
	io.Closer
55
}