@@ -26,6 +26,14 @@ pub const DELAY: u64 = 300;
26
26
27
27
type ParameterMap = BTreeMap < & ' static str , String > ;
28
28
29
+ macro_rules! params {
30
+ ( $( $key: expr => $val: expr) ,* ) => { {
31
+ let mut map = BTreeMap :: <_, _>:: new( ) ;
32
+ $( map. insert( $key, $val) ; ) *
33
+ map
34
+ } } ;
35
+ }
36
+
29
37
header ! { ( TZ , "Time-Zone" ) => [ String ] }
30
38
header ! { ( Accept , "Accept" ) => [ String ] }
31
39
header ! { ( RateLimitRemaining , "X-RateLimit-Remaining" ) => [ u32 ] }
@@ -66,7 +74,7 @@ impl Client {
66
74
67
75
pub fn org_repos ( & self , org : & str ) -> DashResult < Vec < String > > {
68
76
let url = format ! ( "{}/orgs/{}/repos" , BASE_URL , org) ;
69
- let vals: Vec < serde_json:: Value > = try! ( self . get_models ( & url, None ) ) ;
77
+ let vals: Vec < serde_json:: Value > = self . get_models ( & url, None ) ? ;
70
78
71
79
let mut repos = Vec :: new ( ) ;
72
80
for v in vals {
@@ -85,40 +93,34 @@ impl Client {
85
93
}
86
94
87
95
pub fn issues_since ( & self , repo : & str , start : DateTime < Utc > ) -> DashResult < Vec < IssueFromJson > > {
88
-
89
- let url = format ! ( "{}/repos/{}/issues" , BASE_URL , repo) ;
90
- let mut params = ParameterMap :: new ( ) ;
91
-
92
- params. insert ( "state" , "all" . to_string ( ) ) ;
93
- params. insert ( "since" , format ! ( "{:?}" , start) ) ;
94
- params. insert ( "state" , "all" . to_string ( ) ) ;
95
- params. insert ( "per_page" , format ! ( "{}" , PER_PAGE ) ) ;
96
- params. insert ( "direction" , "asc" . to_string ( ) ) ;
97
-
98
- self . get_models ( & url, Some ( & params) )
96
+ self . get_models ( & format ! ( "{}/repos/{}/issues" , BASE_URL , repo) ,
97
+ Some ( & params ! {
98
+ "state" => "all" . to_string( ) ,
99
+ "since" => format!( "{:?}" , start) ,
100
+ "per_page" => format!( "{}" , PER_PAGE ) ,
101
+ "direction" => "asc" . to_string( )
102
+ } ) )
99
103
}
100
104
101
105
pub fn comments_since ( & self ,
102
106
repo : & str ,
103
107
start : DateTime < Utc > )
104
108
-> DashResult < Vec < CommentFromJson > > {
105
- let url = format ! ( "{}/repos/{}/issues/comments" , BASE_URL , repo) ;
106
- let mut params = ParameterMap :: new ( ) ;
107
-
108
- params. insert ( "sort" , "created" . to_string ( ) ) ;
109
- params. insert ( "direction" , "asc" . to_string ( ) ) ;
110
- params. insert ( "since" , format ! ( "{:?}" , start) ) ;
111
- params. insert ( "per_page" , format ! ( "{}" , PER_PAGE ) ) ;
112
-
113
- self . get_models ( & url, Some ( & params) )
109
+ self . get_models ( & format ! ( "{}/repos/{}/issues/comments" , BASE_URL , repo) ,
110
+ Some ( & params ! {
111
+ "sort" => "created" . to_string( ) ,
112
+ "direction" => "asc" . to_string( ) ,
113
+ "since" => format!( "{:?}" , start) ,
114
+ "per_page" => format!( "{}" , PER_PAGE )
115
+ } ) )
114
116
}
115
117
116
118
fn get_models < M : DeserializeOwned > ( & self ,
117
119
start_url : & str ,
118
120
params : Option < & ParameterMap > )
119
121
-> DashResult < Vec < M > > {
120
122
121
- let mut res = try! ( self . get ( start_url, params) ) ;
123
+ let mut res = self . get ( start_url, params) ? ;
122
124
let mut models = self . deserialize :: < Vec < M > > ( & mut res) ?;
123
125
while let Some ( url) = Self :: next_page ( & res. headers ) {
124
126
sleep ( Duration :: from_millis ( DELAY ) ) ;
@@ -129,9 +131,7 @@ impl Client {
129
131
}
130
132
131
133
pub fn fetch_pull_request ( & self , pr_info : & PullRequestUrls ) -> DashResult < PullRequestFromJson > {
132
- let url = pr_info. get ( "url" ) ;
133
-
134
- if let Some ( url) = url {
134
+ if let Some ( url) = pr_info. get ( "url" ) {
135
135
let mut res = self . get ( url, None ) ?;
136
136
self . deserialize ( & mut res)
137
137
} else {
@@ -164,11 +164,7 @@ impl Client {
164
164
165
165
pub fn close_issue ( & self , repo : & str , issue_num : i32 ) -> DashResult < ( ) > {
166
166
let url = format ! ( "{}/repos/{}/issues/{}" , BASE_URL , repo, issue_num) ;
167
-
168
- let mut obj = BTreeMap :: new ( ) ;
169
- obj. insert ( "state" , "closed" ) ;
170
- let payload = serde_json:: to_string ( & obj) ?;
171
-
167
+ let payload = serde_json:: to_string ( & params ! ( "state" => "closed" ) ) ?;
172
168
let mut res = self . patch ( & url, & payload) ?;
173
169
174
170
if StatusCode :: Ok != res. status {
@@ -213,10 +209,7 @@ impl Client {
213
209
-> DashResult < CommentFromJson > {
214
210
let url = format ! ( "{}/repos/{}/issues/{}/comments" , BASE_URL , repo, issue_num) ;
215
211
216
- let mut obj = BTreeMap :: new ( ) ;
217
- obj. insert ( "body" , text) ;
218
-
219
- let payload = serde_json:: to_string ( & obj) ?;
212
+ let payload = serde_json:: to_string ( & params ! ( "body" => text) ) ?;
220
213
221
214
// FIXME propagate an error if it's a 404 or other error
222
215
self . deserialize ( & mut self . post ( & url, & payload) ?)
@@ -232,10 +225,7 @@ impl Client {
232
225
repo,
233
226
comment_num) ;
234
227
235
- let mut obj = BTreeMap :: new ( ) ;
236
- obj. insert ( "body" , text) ;
237
-
238
- let payload = serde_json:: to_string ( & obj) ?;
228
+ let payload = serde_json:: to_string ( & params ! ( "body" => text) ) ?;
239
229
240
230
// FIXME propagate an error if it's a 404 or other error
241
231
self . deserialize ( & mut self . patch ( & url, & payload) ?)
0 commit comments