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 "PageBuildEvent":
80		payload = &PageBuildEvent{}
81	case "PingEvent":
82		payload = &PingEvent{}
83	case "ProjectEvent":
84		payload = &ProjectEvent{}
85	case "ProjectCardEvent":
86		payload = &ProjectCardEvent{}
87	case "ProjectColumnEvent":
88		payload = &ProjectColumnEvent{}
89	case "PublicEvent":
90		payload = &PublicEvent{}
91	case "PullRequestEvent":
92		payload = &PullRequestEvent{}
93	case "PullRequestReviewEvent":
94		payload = &PullRequestReviewEvent{}
95	case "PullRequestReviewCommentEvent":
96		payload = &PullRequestReviewCommentEvent{}
97	case "PushEvent":
98		payload = &PushEvent{}
99	case "ReleaseEvent":
100		payload = &ReleaseEvent{}
101	case "RepositoryEvent":
102		payload = &RepositoryEvent{}
103	case "RepositoryVulnerabilityAlertEvent":
104		payload = &RepositoryVulnerabilityAlertEvent{}
105	case "StarEvent":
106		payload = &StarEvent{}
107	case "StatusEvent":
108		payload = &StatusEvent{}
109	case "TeamEvent":
110		payload = &TeamEvent{}
111	case "TeamAddEvent":
112		payload = &TeamAddEvent{}
113	case "WatchEvent":
114		payload = &WatchEvent{}
115	}
116	err = json.Unmarshal(*e.RawPayload, &payload)
117	return payload, err
118}
119
120// Payload returns the parsed event payload. For recognized event types,
121// a value of the corresponding struct type will be returned.
122//
123// Deprecated: Use ParsePayload instead, which returns an error
124// rather than panics if JSON unmarshaling raw payload fails.
125func (e *Event) Payload() (payload interface{}) {
126	var err error
127	payload, err = e.ParsePayload()
128	if err != nil {
129		panic(err)
130	}
131	return payload
132}
133