CoolFace
Apppublic

llzai/axonhub

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes
GUID.go108 linesDownload Raw Back to objects
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