A vibe coded tangled fork which supports pijul.
1package xrpc
2
3import (
4 "database/sql"
5 "encoding/json"
6 "log/slog"
7 "net/http"
8
9 "github.com/go-chi/chi/v5"
10 "tangled.org/core/api/tangled"
11 "tangled.org/core/idresolver"
12 "tangled.org/core/knotmirror/config"
13)
14
15type Xrpc struct {
16 cfg *config.Config
17 db *sql.DB
18 resolver *idresolver.Resolver
19 logger *slog.Logger
20}
21
22func New(logger *slog.Logger, cfg *config.Config, db *sql.DB, resolver *idresolver.Resolver) *Xrpc {
23 return &Xrpc{
24 cfg,
25 db,
26 resolver,
27 logger,
28 }
29}
30
31func (x *Xrpc) Router() http.Handler {
32 r := chi.NewRouter()
33
34 r.Route("/xrpc", func(r chi.Router) {
35 r.Get("/"+tangled.GitTempGetArchiveNSID, x.GetArchive)
36 r.Get("/"+tangled.GitTempGetBlobNSID, x.GetBlob)
37 r.Get("/"+tangled.GitTempGetBranchNSID, x.GetBranch)
38 // r.Get("/"+tangled.GitTempGetCommitNSID, x.GetCommit) // todo
39 // r.Get("/"+tangled.GitTempGetDiffNSID, x.GetDiff) // todo
40 // r.Get("/"+tangled.GitTempGetEntityNSID, x.GetEntity) // todo
41 // r.Get("/"+tangled.GitTempGetHeadNSID, x.GetHead) // todo
42 r.Get("/"+tangled.GitTempGetTagNSID, x.GetTag) // using types.Response
43 r.Get("/"+tangled.GitTempGetTreeNSID, x.GetTree)
44 r.Get("/"+tangled.GitTempListBranchesNSID, x.ListBranches) // wip, unknown output
45 r.Get("/"+tangled.GitTempListCommitsNSID, x.ListCommits)
46 r.Get("/"+tangled.GitTempListLanguagesNSID, x.ListLanguages)
47 r.Get("/"+tangled.GitTempListTagsNSID, x.ListTags)
48 })
49
50 return r
51}
52
53func writeJson(w http.ResponseWriter, status int, response any) error {
54 w.Header().Set("Content-Type", "application/json")
55 w.WriteHeader(status)
56 if err := json.NewEncoder(w).Encode(response); err != nil {
57 return err
58 }
59 return nil
60}