1// Copyright 2018 The go-github AUTHORS. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file.
5
6package github
7
8import (
9	"encoding/json"
10	"time"
11)
12
13// Event represents a GitHub event.
14type Event struct {
15	Type       *string          `json:"type,omitempty"`
16	Public     *bool            `json:"public,omitempty"`
17	RawPayload *json.RawMessage `json:"payload,omitempty"`
18	Repo       *Repository      `json:"repo,omitempty"`
19	Actor      *User            `json:"actor,omitempty"`
20	Org        *Organization    `json:"org,omitempty"`
21	CreatedAt  *time.Time       `json:"created_at,omitempty"`
22	ID         *string          `json:"id,omitempty"`
23}
24
25func (e Event) String() string {
26	return Stringify(e)
27}
28
29// ParsePayload parses the event payload. For recognized event types,
30// a value of the corresponding struct type will be returned.
31func (e *Event) ParsePayload() (payload interface{}, err error) {
32	switch *e.Type {
33	case "CheckRunEvent":
34		payload = &CheckRunEvent{}
35	case "CheckSuiteEvent":
36		payload = &CheckSuiteEvent{}
37	case "CommitCommentEvent":
38		payload = &CommitCommentEvent{}
39	case "CreateEvent":
40		payload = &CreateEvent{}
41	case "DeleteEvent":
42		payload = &DeleteEvent{}
43	case "DeployKeyEvent":
44		payload = &DeployKeyEvent{}
45	case "DeploymentEvent":
46		payload = &DeploymentEvent{}
47	case "DeploymentStatusEvent":
48		payload = &DeploymentStatusEvent{}
49	case "ForkEvent":
50		payload = &ForkEvent{}
51	case "GitHubAppAuthorizationEvent":
52		payload = &GitHubAppAuthorizationEvent{}
53	case "GollumEvent":
54		payload = &GollumEvent{}
55	case "InstallationEvent":
56		payload = &InstallationEvent{}
57	case "InstallationRepositoriesEvent":
58		payload = &InstallationRepositoriesEvent{}
59	case "IssueCommentEvent":
60		payload = &IssueCommentEvent{}
61	case "IssuesEvent":
62		payload = &IssuesEvent{}
63	case "LabelEvent":
64		payload = &LabelEvent{}
65	case "MarketplacePurchaseEvent":
66		payload = &MarketplacePurchaseEvent{}
67	case "MemberEvent":
68		payload = &MemberEvent{}
69	case "MembershipEvent":
70		payload = &MembershipEvent{}
71	case "MetaEvent":
72		payload = &MetaEvent{}
73	case "MilestoneEvent":
74		payload = &MilestoneEvent{}
75	case "OrganizationEvent":
76		payload = &OrganizationEvent{}
77	case "OrgBlockEvent":
78		payload = &OrgBlockEvent{}
79	case "PackageEvent":
80		payload = &PackageEvent{}
81	case "PageBuildEvent":
82		payload = &PageBuildEvent{}
83	case "PingEvent":
84		payload = &PingEvent{}
85	case "ProjectEvent":
86		payload = &ProjectEvent{}
87	case "ProjectCardEvent":
88		payload = &ProjectCardEvent{}
89	case "ProjectColumnEvent":
90		payload = &ProjectColumnEvent{}
91	case "PublicEvent":
92		payload = &PublicEvent{}
93	case "PullRequestEvent":
94		payload = &PullRequestEvent{}
95	case "PullRequestReviewEvent":
96		payload = &PullRequestReviewEvent{}
97	case "PullRequestReviewCommentEvent":
98		payload = &PullRequestReviewCommentEvent{}
99	case "PushEvent":
100		payload = &PushEvent{}
101	case "ReleaseEvent":
102		payload = &ReleaseEvent{}
103	case "RepositoryEvent":
104		payload = &RepositoryEvent{}
105	case "RepositoryDispatchEvent":
106		payload = &RepositoryDispatchEvent{}
107	case "RepositoryVulnerabilityAlertEvent":
108		payload = &RepositoryVulnerabilityAlertEvent{}
109	case "StarEvent":
110		payload = &StarEvent{}
111	case "StatusEvent":
112		payload = &StatusEvent{}
113	case "TeamEvent":
114		payload = &TeamEvent{}
115	case "TeamAddEvent":
116		payload = &TeamAddEvent{}
117	case "UserEvent":
118		payload = &UserEvent{}
119	case "WatchEvent":
120		payload = &WatchEvent{}
121	}
122	err = json.Unmarshal(*e.RawPayload, &payload)
123	return payload, err
124}
125
126// Payload returns the parsed event payload. For recognized event types,
127// a value of the corresponding struct type will be returned.
128//
129// Deprecated: Use ParsePayload instead, which returns an error
130// rather than panics if JSON unmarshaling raw payload fails.
131func (e *Event) Payload() (payload interface{}) {
132	var err error
133	payload, err = e.ParsePayload()
134	if err != nil {
135		panic(err)
136	}
137	return payload
138}
139