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 (
80 _ encoding.TextMarshaler = Event(0)
81 _ encoding.TextUnmarshaler = (*Event)(nil)
82)
83
84// UnmarshalText implements encoding.TextUnmarshaler.
85func (e *Event) UnmarshalText(text []byte) error {
86 ev, err := ParseEvent(string(text))
87 if err != nil {
88 return err
89 }
90
91 *e = ev
92 return nil
93}
94
95// MarshalText implements encoding.TextMarshaler.
96func (e Event) MarshalText() (text []byte, err error) {
97 ev := e.String()
98 if ev == "" {
99 return nil, ErrInvalidEvent
100 }
101
102 return []byte(ev), nil
103}