-
Notifications
You must be signed in to change notification settings - Fork 19
/
step.go
103 lines (85 loc) · 2.69 KB
/
step.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
package runs
import (
"encoding/json"
"time"
"github.com/nyaruka/goflow/flows"
"github.com/nyaruka/goflow/flows/events"
"github.com/nyaruka/goflow/utils"
)
type step struct {
stepUUID flows.StepUUID
nodeUUID flows.NodeUUID
exitUUID flows.ExitUUID
arrivedOn time.Time
leftOn *time.Time
events []flows.Event
}
func (s *step) UUID() flows.StepUUID { return s.stepUUID }
func (s *step) NodeUUID() flows.NodeUUID { return s.nodeUUID }
func (s *step) ExitUUID() flows.ExitUUID { return s.exitUUID }
func (s *step) ArrivedOn() time.Time { return s.arrivedOn }
func (s *step) LeftOn() *time.Time { return s.leftOn }
func (s *step) Events() []flows.Event { return s.events }
func (s *step) Leave(exit flows.ExitUUID) {
now := time.Now().UTC()
s.exitUUID = exit
s.leftOn = &now
}
func (s *step) addEvent(e flows.Event) {
e.SetCreatedOn(time.Now().UTC())
s.events = append(s.events, e)
}
func (s *step) addError(err error) {
s.addEvent(&events.ErrorEvent{Text: err.Error()})
}
//------------------------------------------------------------------------------------------
// JSON Encoding / Decoding
//------------------------------------------------------------------------------------------
type stepEnvelope struct {
UUID flows.StepUUID `json:"uuid" validate:"required,uuid4"`
NodeUUID flows.NodeUUID `json:"node_uuid" validate:"required,uuid4"`
ExitUUID flows.ExitUUID `json:"exit_uuid,omitempty" validate:"omitempty,uuid4"`
ArrivedOn time.Time `json:"arrived_on"`
LeftOn *time.Time `json:"left_on,omitempty"`
Events []*utils.TypedEnvelope `json:"events,omitempty" validate:"omitempty,dive"`
}
// UnmarshalJSON unmarshals a run step from the given JSON
func (s *step) UnmarshalJSON(data []byte) error {
var se stepEnvelope
var err error
err = json.Unmarshal(data, &se)
if err != nil {
return err
}
s.stepUUID = se.UUID
s.nodeUUID = se.NodeUUID
s.exitUUID = se.ExitUUID
s.arrivedOn = se.ArrivedOn
s.leftOn = se.LeftOn
s.events = make([]flows.Event, len(se.Events))
for i := range s.events {
s.events[i], err = events.EventFromEnvelope(se.Events[i])
if err != nil {
return err
}
}
return err
}
// MarshalJSON marshals this run step into JSON
func (s *step) MarshalJSON() ([]byte, error) {
var se stepEnvelope
se.UUID = s.stepUUID
se.NodeUUID = s.nodeUUID
se.ExitUUID = s.exitUUID
se.ArrivedOn = s.arrivedOn
se.LeftOn = s.leftOn
se.Events = make([]*utils.TypedEnvelope, len(s.events))
for i, event := range s.events {
eventData, err := json.Marshal(event)
if err != nil {
return nil, err
}
se.Events[i] = &utils.TypedEnvelope{Type: event.Type(), Data: eventData}
}
return json.Marshal(se)
}