File size: 2,124 Bytes
9853396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package objects

import (
	"errors"
	"fmt"
	"io"
	"strconv"
	"strings"

	"github.com/samber/lo"
)

type GUID struct {
	Type string `json:"type"`
	ID   int    `json:"id"`
}

func (guid GUID) MarshalGQL(w io.Writer) {
	_, _ = io.WriteString(w, strconv.Quote(fmt.Sprintf("gid://axonhub/%s/%d", guid.Type, guid.ID)))
}

func (guid *GUID) UnmarshalGQL(v any) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enum %T must be a string", v)
	}

	if str == "" {
		return errors.New("guid is empty")
	}

	if !strings.HasPrefix(str, "gid://axonhub/") {
		return errors.New("guid must start with gid://axonhub/")
	}

	str = str[14:] // Remove "gid://axonhub/" prefix

	before, after, ok0 := strings.Cut(str, "/")
	if !ok0 {
		return errors.New("guid must contain type and id")
	}

	typ := before

	id, err := strconv.Atoi(after)
	if err != nil {
		return err
	}

	guid.Type = typ
	guid.ID = id

	return nil
}

func ParseGUID(str string) (GUID, error) {
	var guid GUID

	err := guid.UnmarshalGQL(str)
	if err != nil {
		return GUID{}, err
	}

	return guid, nil
}

// ConvertGUIDToInt converts a GUID to an int id.
// TODO: validate the type from the context.
func ConvertGUIDToInt(guid GUID) (int, error) {
	return guid.ID, nil
}

func ConvertGUIDPtrToInt(guid *GUID) (int, error) {
	if guid == nil {
		return 0, errors.New("guid is nil")
	}

	return guid.ID, nil
}

func ConvertGUIDToIntPtr(guid GUID) (*int, error) {
	return lo.ToPtr(guid.ID), nil
}

func ConvertGUIDPtrToIntPtr(guid *GUID) (*int, error) {
	if guid == nil {
		return nil, errors.New("guid is nil")
	}

	return lo.ToPtr(guid.ID), nil
}

func ConvertGUIDPtrsToIntPtrs(guid []*GUID) ([]*int, error) {
	return lo.Map(guid, func(item *GUID, index int) *int {
		return lo.ToPtr(item.ID)
	}), nil
}

func ConvertGUIDPtrsToInts(guid []*GUID) ([]int, error) {
	return lo.Map(guid, func(item *GUID, index int) int {
		return item.ID
	}), nil
}

func IntGuids(guids []*GUID) []int {
	return lo.Map(guids, func(item *GUID, index int) int { return item.ID })
}