llzai/axonhub
0
1package objects
2
3import (
4 "errors"
5 "fmt"
6 "io"
7 "strconv"
8 "strings"
9
10 "github.com/samber/lo"
11)
12
13type GUID struct {
14 Type string `json:"type"`
15 ID int `json:"id"`
16}
17
18func (guid GUID) MarshalGQL(w io.Writer) {
19 _, _ = io.WriteString(w, strconv.Quote(fmt.Sprintf("gid://axonhub/%s/%d", guid.Type, guid.ID)))
20}
21
22func (guid *GUID) UnmarshalGQL(v any) error {
23 str, ok := v.(string)
24 if !ok {
25 return fmt.Errorf("enum %T must be a string", v)
26 }
27
28 if str == "" {
29 return errors.New("guid is empty")
30 }
31
32 if !strings.HasPrefix(str, "gid://axonhub/") {
33 return errors.New("guid must start with gid://axonhub/")
34 }
35
36 str = str[14:] // Remove "gid://axonhub/" prefix
37
38 before, after, ok0 := strings.Cut(str, "/")
39 if !ok0 {
40 return errors.New("guid must contain type and id")
41 }
42
43 typ := before
44
45 id, err := strconv.Atoi(after)
46 if err != nil {
47 return err
48 }
49
50 guid.Type = typ
51 guid.ID = id
52
53 return nil
54}
55
56func ParseGUID(str string) (GUID, error) {
57 var guid GUID
58
59 err := guid.UnmarshalGQL(str)
60 if err != nil {
61 return GUID{}, err
62 }
63
64 return guid, nil
65}
66
67// ConvertGUIDToInt converts a GUID to an int id.
68// TODO: validate the type from the context.
69func ConvertGUIDToInt(guid GUID) (int, error) {
70 return guid.ID, nil
71}
72
73func ConvertGUIDPtrToInt(guid *GUID) (int, error) {
74 if guid == nil {
75 return 0, errors.New("guid is nil")
76 }
77
78 return guid.ID, nil
79}
80
81func ConvertGUIDToIntPtr(guid GUID) (*int, error) {
82 return lo.ToPtr(guid.ID), nil
83}
84
85func ConvertGUIDPtrToIntPtr(guid *GUID) (*int, error) {
86 if guid == nil {
87 return nil, errors.New("guid is nil")
88 }
89
90 return lo.ToPtr(guid.ID), nil
91}
92
93func ConvertGUIDPtrsToIntPtrs(guid []*GUID) ([]*int, error) {
94 return lo.Map(guid, func(item *GUID, index int) *int {
95 return lo.ToPtr(item.ID)
96 }), nil
97}
98
99func ConvertGUIDPtrsToInts(guid []*GUID) ([]int, error) {
100 return lo.Map(guid, func(item *GUID, index int) int {
101 return item.ID
102 }), nil
103}
104
105func IntGuids(guids []*GUID) []int {
106 return lo.Map(guids, func(item *GUID, index int) int { return item.ID })
107}
108 