This repository has no description
1package models
2
3import (
4 "fmt"
5
6 "github.com/bluesky-social/indigo/atproto/syntax"
7 "tangled.org/core/api/tangled"
8)
9
10type StateValue string
11
12const (
13 StateOpen StateValue = "open"
14 StateClosed StateValue = "closed"
15 StateMerged StateValue = "merged"
16)
17
18type StateRecord struct {
19 Did string
20 Rkey string
21 Subject syntax.ATURI
22 Value StateValue
23 SortMicros int64
24}
25
26func sortMicros(createdAt, rkey string) int64 {
27 if t, err := syntax.ParseDatetimeTime(createdAt); err == nil {
28 return t.UnixMicro()
29 }
30 if tid, err := syntax.ParseTID(rkey); err == nil {
31 return tid.Time().UnixMicro()
32 }
33 return 0
34}
35
36func newStateRecord(did, rkey, subjectUri, createdAt string, value StateValue) (StateRecord, error) {
37 subject, err := syntax.ParseATURI(subjectUri)
38 if err != nil {
39 return StateRecord{}, fmt.Errorf("invalid subject uri: %w", err)
40 }
41 return StateRecord{
42 Did: did,
43 Rkey: rkey,
44 Subject: subject,
45 Value: value,
46 SortMicros: sortMicros(createdAt, rkey),
47 }, nil
48}
49
50func IssueStateFromRecord(did, rkey string, record tangled.RepoIssueState) (StateRecord, error) {
51 switch record.State {
52 case tangled.RepoIssueStateOpen:
53 return newStateRecord(did, rkey, record.Issue, record.CreatedAt, StateOpen)
54 case tangled.RepoIssueStateClosed:
55 return newStateRecord(did, rkey, record.Issue, record.CreatedAt, StateClosed)
56 default:
57 return StateRecord{}, fmt.Errorf("unknown issue state variant: %q", record.State)
58 }
59}
60
61func PullStatusFromRecord(did, rkey string, record tangled.RepoPullStatus) (StateRecord, error) {
62 switch record.Status {
63 case tangled.RepoPullStatusOpen:
64 return newStateRecord(did, rkey, record.Pull, record.CreatedAt, StateOpen)
65 case tangled.RepoPullStatusClosed:
66 return newStateRecord(did, rkey, record.Pull, record.CreatedAt, StateClosed)
67 case tangled.RepoPullStatusMerged:
68 return newStateRecord(did, rkey, record.Pull, record.CreatedAt, StateMerged)
69 default:
70 return StateRecord{}, fmt.Errorf("unknown pull status variant: %q", record.Status)
71 }
72}