1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
use github::Client;
use json::Event;
use requests::*;
use error::*;
use serde_json;

/// Trait used to define access to endpoints grouped under `Activity` in the Github API
/// specification
pub trait Activity {
    // Events
    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /events
    /// ### Description
    /// Returns a vector of recent `Event`s from the API
    fn get_events(&self) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /repos/:owner/:repo/events
    /// ### Description
    /// Returns a vector of `Event`s from the repo of a given owner
    fn get_repos_owner_repo_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /repos/:owner/:repo/issues/events
    /// ### Description
    /// Returns a vector of `Event`s from the issues of a repo of a given owner
    fn get_repos_owner_repo_issues_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /networks/:owner/:repo/events
    /// ### Description
    /// Returns a vector of `Event`s from the network of a repo of a given owner
    fn get_networks_owner_repo_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /orgs/:org/events
    /// ### Description
    /// Returns a vector of `Event`s from a given organization
    fn get_orgs_org_events(&self, org: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/received_events
    /// ### Description
    /// Returns a vector of `Event`s the username has received. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_received_events(&self, username: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/received_events/public
    /// ### Description
    /// Returns a vector of public `Event`s the username has received.
    fn get_users_username_received_events_public(&self, username: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events
    /// ### Description
    /// Returns a vector of `Event`s performed by the username. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_events(&self, username: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events/public
    /// ### Description
    /// Returns a vector of `Event`s performed by the username. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_events_public(&self, username: &str) -> Result<Vec<Event>>;

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events/orgs/:org
    /// ### Description
    /// Returns a vector of `Event`s from the username's org. You must be authenticated to view
    /// this.
    fn get_users_username_events_orgs_org(&self, username: &str, org: &str) -> Result<Vec<Event>>;
}

// Doc comments are duplicated so that regardless of trait or client they see how to use it
impl Activity for Client {
    // EVENTS TODO UPDATE TO INCLUDE PAGINATION
    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /events
    /// ### Description
    /// Returns a vector of recent `Event`s from the API
    fn get_events(&self) -> Result<Vec<Event>> {
        let url = "https://api.github.com/events";
        let data = get(url, self.get_headers().clone())?;

        // If the auth token is wrong we want this to panic.
        try_serde!(serde_json::from_str(&data))

    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /repos/:owner/:repo/events
    /// ### Description
    /// Returns a vector of `Event`s from the repo of a given owner
    fn get_repos_owner_repo_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/repos/");
        url.push_str(owner);
        url.push('/');
        url.push_str(repo);
        url.push_str("/events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /repos/:owner/:repo/issues/events
    /// ### Description
    /// Returns a vector of `Event`s from the issues of a repo of a given owner
    fn get_repos_owner_repo_issues_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/repos/");
        url.push_str(owner);
        url.push('/');
        url.push_str(repo);
        url.push_str("/issues/events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /networks/:owner/:repo/events
    /// ### Description
    /// Returns a vector of `Event`s from the network of a repo of a given owner
    fn get_networks_owner_repo_events(&self, owner: &str, repo: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/networks/");
        url.push_str(owner);
        url.push('/');
        url.push_str(repo);
        url.push_str("/events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /orgs/:org/events
    /// ### Description
    /// Returns a vector of `Event`s from a given organization
    fn get_orgs_org_events(&self, org: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/orgs/");
        url.push_str(org);
        url.push_str("/events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))

    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/received_events
    /// ### Description
    /// Returns a vector of `Event`s the username has received. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_received_events(&self, username: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/users/");
        url.push_str(username);
        url.push_str("/received_events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))

    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/received_events/public
    /// ### Description
    /// Returns a vector of public `Event`s the username has received.
    fn get_users_username_received_events_public(&self, username: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/users/");
        url.push_str(username);
        url.push_str("/received_events/public");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events
    /// ### Description
    /// Returns a vector of `Event`s performed by the username. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_events(&self, username: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/users/");
        url.push_str(username);
        url.push_str("/events");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events/public
    /// ### Description
    /// Returns a vector of `Event`s performed by the username. If you are authenticated and use
    /// your own username you will see private `Event`s
    fn get_users_username_events_public(&self, username: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/users/");
        url.push_str(username);
        url.push_str("/events/public");
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))
    }

    /// ### Request Type:
    /// `GET`
    /// ### Endpoint:
    /// /users/:username/events/orgs/:org
    /// ### Description
    /// Returns a vector of `Event`s from the username's org. You must be authenticated to view
    /// this.
    fn get_users_username_events_orgs_org(&self, username: &str, org: &str) -> Result<Vec<Event>> {
        let mut url = String::from("https://api.github.com/users/");
        url.push_str(username);
        url.push_str("/events/orgs/");
        url.push_str(org);
        let data = get(&url, self.get_headers().clone())?;

        try_serde!(serde_json::from_str(&data))

    }
}