okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

Aly Raffaufrefactor(cli): use generated response field metadata7e45521

main
1.5 KiB54 linesraw
1package daemon
2
3import (
4	"context"
5	"io"
6	"net/http"
7
8	"albedo/cli/internal/daemon/protocol"
9)
10
11type TreeCheckpoint struct {
12	Timestamp         *int64
13	Type, Preview, ID string
14	Position          int
15}
16type TreePage struct {
17	NextCursor *int
18	Items      []TreeCheckpoint
19	HasMore    bool
20}
21
22func GetSessionTree(ctx context.Context, conn *Connection, id string, after, limit int) (TreePage, error) {
23	params := protocol.GetHistoryParams{View: new("checkpoints"), Limit: new(int64(min(max(limit, 1), 200)))}
24	if after > 0 {
25		params.After = new(int64(after))
26	}
27	var result TreePage
28	err := executeRead(ctx, conn, operation{Name: "read checkpoints", BuildRequest: func(base string, body io.Reader) (*http.Request, error) {
29		return protocol.NewGetHistoryRequest(base, id, &params)
30	}, Policy: readRecovery}, func(data []byte) error {
31		var w protocol.CheckpointPage
32		if err := decodeRequired(data, &w); err != nil {
33			return err
34		}
35		result.Items = []TreeCheckpoint{}
36		previous := after
37		for _, row := range w.Items {
38			if row.CheckpointID == "" || row.Position <= int64(previous) {
39				return fieldError("checkpoint")
40			}
41			previous = int(row.Position)
42			result.Items = append(result.Items, TreeCheckpoint{ID: row.CheckpointID, Position: int(row.Position), Type: row.TurnType, Preview: row.Preview.Text})
43		}
44		result.HasMore = w.Newer != nil
45		if result.HasMore {
46			if len(w.Items) == 0 {
47				return fieldError("checkpoint page")
48			}
49			result.NextCursor = &previous
50		}
51		return nil
52	})
53	return result, err
54}