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}