1package webhook
2
3import (
4 "encoding"
5 "errors"
6)
7
8// Event is a webhook event.
9type Event int
10
11const (
12 // EventBranchTagCreate is a branch or tag create event.
13 EventBranchTagCreate Event = 1
14
15 // EventBranchTagDelete is a branch or tag delete event.
16 EventBranchTagDelete Event = 2
17
18 // EventCollaborator is a collaborator change event.
19 EventCollaborator Event = 3
20
21 // EventPush is a push event.
22 EventPush Event = 4
23
24 // EventRepository is a repository create, delete, rename event.
25 EventRepository Event = 5
26
27 // EventRepositoryVisibilityChange is a repository visibility change event.
28 EventRepositoryVisibilityChange Event = 6
29)
30
31// Events return all events.
32func Events() []Event {
33 return []Event{
34 EventBranchTagCreate,
35 EventBranchTagDelete,
36 EventCollaborator,
37 EventPush,
38 EventRepository,
39 EventRepositoryVisibilityChange,
40 }
41}
42
43var eventStrings = map[Event]string{
44 EventBranchTagCreate: "branch_tag_create",
45 EventBranchTagDelete: "branch_tag_delete",
46 EventCollaborator: "collaborator",
47 EventPush: "push",
48 EventRepository: "repository",
49 EventRepositoryVisibilityChange: "repository_visibility_change",
50}
51
52// String returns the string representation of the event.
53func (e Event) String() string {
54 return eventStrings[e]
55}
56
57var stringEvent = map[string]Event{
58 "branch_tag_create": EventBranchTagCreate,
59 "branch_tag_delete": EventBranchTagDelete,
60 "collaborator": EventCollaborator,
61 "push": EventPush,
62 "repository": EventRepository,
63 "repository_visibility_change": EventRepositoryVisibilityChange,
64}
65
66// ErrInvalidEvent is returned when the event is invalid.
67var ErrInvalidEvent = errors.New("invalid event")
68
69// ParseEvent parses an event string and returns the event.
70func ParseEvent(s string) (Event, error) {
71 e, ok := stringEvent[s]
72 if !ok {
73 return -1, ErrInvalidEvent
74 }
75
76 return e, nil
77}
78
79var _ encoding.TextMarshaler = Event(0)
80var _ encoding.TextUnmarshaler = (*Event)(nil)
81
82// UnmarshalText implements encoding.TextUnmarshaler.
83func (e *Event) UnmarshalText(text []byte) error {
84 ev, err := ParseEvent(string(text))
85 if err != nil {
86 return err
87 }
88
89 *e = ev
90 return nil
91}
92
93// MarshalText implements encoding.TextMarshaler.
94func (e Event) MarshalText() (text []byte, err error) {
95 ev := e.String()
96 if ev == "" {
97 return nil, ErrInvalidEvent
98 }
99
100 return []byte(ev), nil
101}