-
Notifications
You must be signed in to change notification settings - Fork 0
/
callsite.go
123 lines (98 loc) · 2.84 KB
/
callsite.go
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package engineio
import (
"encoding/json"
"errors"
"github.com/sarvalabs/go-polo"
"gopkg.in/yaml.v3"
)
// Callsite represents a callable point in a Logic.
// It can be resolved from a string identifier
// with the GetCallsite method on Logic
type Callsite struct {
Ptr ElementPtr
Kind CallsiteKind
}
// CallsiteKind represents the type of callable point in a Logic.
type CallsiteKind int
const (
LocalCallsite CallsiteKind = iota
InvokableCallsite
InteractableCallsite
DeployerCallsite
EnlisterCallsite
)
var callsiteKindToString = map[CallsiteKind]string{
LocalCallsite: "local",
InvokableCallsite: "invokable",
InteractableCallsite: "interactable",
DeployerCallsite: "deployer",
EnlisterCallsite: "enlister",
}
var callsiteKindFromString = map[string]CallsiteKind{
"local": LocalCallsite,
"invokable": InvokableCallsite,
"interactable": InteractableCallsite,
"deployer": DeployerCallsite,
"enlister": EnlisterCallsite,
}
// String implements the Stringer interface for CallsiteKind
func (callsite CallsiteKind) String() string {
str, ok := callsiteKindToString[callsite]
if !ok {
panic("unknown CallsiteKind variant")
}
return str
}
// Polorize implements the polo.Polorizable interface for CallsiteKind
func (callsite CallsiteKind) Polorize() (*polo.Polorizer, error) {
polorizer := polo.NewPolorizer()
polorizer.PolorizeString(callsite.String())
return polorizer, nil
}
// Depolorize implements the polo.Depolorizable interface for CallsiteKind
func (callsite *CallsiteKind) Depolorize(depolorizer *polo.Depolorizer) error {
raw, err := depolorizer.DepolorizeString()
if err != nil {
return err
}
kind, ok := callsiteKindFromString[raw]
if !ok {
return errors.New("invalid CallsiteKind value")
}
*callsite = kind
return nil
}
// MarshalJSON implements the json.Marshaller interface for CallsiteKind
func (callsite CallsiteKind) MarshalJSON() ([]byte, error) {
return json.Marshal(callsite.String())
}
// UnmarshalJSON implements the json.Unmarshaller interface for CallsiteKind
func (callsite *CallsiteKind) UnmarshalJSON(data []byte) error {
raw := new(string)
if err := json.Unmarshal(data, raw); err != nil {
return err
}
kind, ok := callsiteKindFromString[*raw]
if !ok {
return errors.New("invalid CallsiteKind value")
}
*callsite = kind
return nil
}
// MarshalYAML implements the yaml.Marshaller interface for CallsiteKind
func (callsite CallsiteKind) MarshalYAML() (interface{}, error) {
return callsite.String(), nil
}
// UnmarshalYAML implements the yaml.Unmarshaller interface for CallsiteKind
func (callsite *CallsiteKind) UnmarshalYAML(node *yaml.Node) error {
raw := new(string)
if err := node.Decode(raw); err != nil {
return err
}
kind, ok := callsiteKindFromString[*raw]
if !ok {
return errors.New("invalid CallsiteKind value")
}
*callsite = kind
return nil
}