1+ use  self :: req:: { Json ,  Mode ,  Req } ; 
2+ use  crate :: { 
3+  conf:: { self ,  Config } , 
4+  plugins:: chrome, 
5+ } ; 
6+ 
17use  std:: { 
28 collections:: HashMap , 
39 str:: FromStr , 
@@ -15,14 +21,6 @@ use reqwest::{
1521 } 
1622} ; 
1723
18- use  crate :: { 
19-  plugins:: chrome, 
20-  conf:: { self ,  Config } , 
21- } ; 
22- 
23- /// Standardize leetcode api response 
24- pub  type  LeetCodeResp  = Option < Response > ; 
25- 
2624/// Leet API set 
2725pub  struct  LeetCode  { 
2826 conf :  Config , 
@@ -31,7 +29,8 @@ pub struct LeetCode {
3129} 
3230
3331impl  LeetCode  { 
34-  fn  headers ( mut  headers :  HeaderMap ,  ts :  Vec < ( & str ,  & str ) > )  -> HeaderMap  { 
32+  /// Parse reqwest headers 
33+ pub  fn  headers ( mut  headers :  HeaderMap ,  ts :  Vec < ( & str ,  & str ) > )  -> HeaderMap  { 
3534 for  ( k,  v)  in  ts. into_iter ( )  { 
3635 headers. insert ( 
3736 HeaderName :: from_str ( k) . unwrap ( ) , 
@@ -41,10 +40,10 @@ impl LeetCode {
4140
4241 headers
4342 } 
44-  
43+ 
44+  /// New LeetCode client 
4545pub  fn  new ( )  -> LeetCode  { 
46-  debug ! ( "building reqwest client..." ) ; 
47-  
46+  debug ! ( "Building reqwest client..." ) ; 
4847 let  conf = conf:: locate ( ) ; 
4948 let  cookies = chrome:: cookies ( ) ; 
5049 let  default_headers = LeetCode :: headers ( 
@@ -71,40 +70,40 @@ impl LeetCode {
7170 } 
7271 } 
7372
74-  pub   fn   get_favorites ( self )  ->  LeetCodeResp   { 
75-    debug ! ( "running leetcode.get_category_problems..." ) ; 
73+  /// Get user favorite problems 
74+ pub   fn   get_favorites ( self )  ->  Response   { 
7675 let  url = & self . conf . sys . urls [ "favorites" ] ; 
77-  let  headers = LeetCode :: headers ( 
78-  self . default_headers , 
79-  vec ! [ ( "Referer" ,  url) ] , 
80-  ) ; 
8176
82-  let  req = self . client 
83-  . get ( url) 
84-  . headers ( headers) ; 
77+  Req  { 
78+  default_headers :  self . default_headers , 
79+  info :  false , 
80+  json :  None , 
81+  mode :  Mode :: Get , 
82+  name :  "get_favorites" , 
83+  url :  url. to_string ( ) , 
84+  } . send ( & self . client ) 
85+  } 
8586
86-  println ! ( "{:#?}" ,  & req) ; 
87-  let  res = req
88-  . send ( ) ; 
87+  /// Get category problems 
88+ pub  fn  get_category_problems ( self ,  category :  & ' static  str )  -> Response  { 
89+  let  pre_url = & self . conf . sys . urls [ "problems" ] ; 
90+  let  url = & pre_url. replace ( "$category" ,  category) ; 
8991
90-  match  res. is_err ( )  { 
91-  true  => { 
92-  error ! ( "get_favorites request failed." ) ; 
93-  None 
94-  } 
95-  _ => Some ( res. unwrap ( ) ) 
96-  } 
92+  Req  { 
93+  default_headers :  self . default_headers , 
94+  info :  false , 
95+  json :  None , 
96+  mode :  Mode :: Get , 
97+  name :  "get_category_problems" , 
98+  url :  url. to_string ( ) , 
99+  } . send ( & self . client ) 
97100 } 
98-  
99-  pub  fn  get_user_info ( self )  -> Option < Response >  { 
100-  debug ! ( "running leetcode.get_user_info..." ) ; 
101-  let  headers = LeetCode :: headers ( 
102-  self . default_headers , 
103-  vec ! [ ( "Referer" ,  & self . conf. sys. urls[ "graphql" ] ) ] , 
104-  ) ; 
105-  
106-  let  mut  m:  HashMap < & str ,  & str >  = HashMap :: new ( ) ; 
107-  m. insert ( 
101+ 
102+  /// Get user info 
103+ pub  fn  get_user_info ( self )  -> Response  { 
104+  let  url = & self . conf . sys . urls [ "graphql" ] ; 
105+  let  mut  json:  Json  = HashMap :: new ( ) ; 
106+  json. insert ( 
108107 "query" , 
109108 r#"{ 
110109 user { 
@@ -113,19 +112,81 @@ impl LeetCode {
113112 }, 
114113 }"# , 
115114 ) ; 
115+  
116+  Req  { 
117+  default_headers :  self . default_headers , 
118+  info :  false , 
119+  json :  Some ( json) , 
120+  mode :  Mode :: Post , 
121+  name :  "get_user_info" , 
122+  url :  url. to_string ( ) , 
123+  } . send ( & self . client ) 
124+  } 
125+ } 
116126
117-  let  res = self . client 
118-  . post ( & self . conf . sys . urls [ "graphql" ] ) 
119-  . headers ( headers) 
120-  . json ( & m) 
121-  . send ( ) ; 
122127
123-  match  res. is_err ( )  { 
124-  true  => { 
125-  error ! ( "get_user_info request failed." ) ; 
126-  None 
128+ /// Sub-module for leetcode, simplify requests 
129+ mod  req { 
130+  use  super :: LeetCode ; 
131+  use  std:: collections:: HashMap ; 
132+  use  reqwest:: { 
133+  Client , 
134+  header:: HeaderMap , 
135+  RequestBuilder , 
136+  Response , 
137+  } ; 
138+ 
139+  /// Standardize json format 
140+ pub  type  Json  = HashMap < & ' static  str ,  & ' static  str > ; 
141+ 
142+  /// Standardize request mode 
143+ pub  enum  Mode  { 
144+  Get , 
145+  Post 
146+  } 
147+ 
148+  /// LeetCode request prototype 
149+ pub  struct  Req  { 
150+  pub  default_headers :  HeaderMap , 
151+  pub  json :  Option < Json > , 
152+  pub  info :  bool , 
153+  pub  mode :  Mode , 
154+  pub  name :  & ' static  str , 
155+  pub  url :  String , 
156+  } 
157+ 
158+  impl  Req  { 
159+  pub  fn  send < ' req > ( self ,  client :  & ' req  Client )  -> Response  { 
160+  debug ! ( "Running leetcode::{}..." ,  & self . name) ; 
161+  if  self . info  { 
162+  info ! ( "Downloading {} deps..." ,  & self . name) ; 
163+  } 
164+  
165+  let  headers = LeetCode :: headers ( 
166+  self . default_headers , 
167+  vec ! [ ( "Referer" ,  & self . url) ] , 
168+  ) ; 
169+ 
170+  let  req:  RequestBuilder ; 
171+  match  self . mode  { 
172+  Mode :: Get  => { 
173+  req = client. get ( & self . url ) ; 
174+  } , 
175+  Mode :: Post  => { 
176+  req = client. post ( & self . url ) . json ( & self . json ) ; 
177+  } 
178+  } 
179+  
180+  let  res = req
181+  . headers ( headers) 
182+  . send ( ) ; 
183+ 
184+  if  res. is_err ( )  { 
185+  error ! ( "leetcode::{} went error." ,  & self . name) ; 
186+  panic ! ( "leetcode::{} failed." ,  & self . name) ; 
127187 } 
128-  _ => Some ( res. unwrap ( ) ) 
188+ 
189+  res. unwrap ( ) 
129190 } 
130191 } 
131192} 
0 commit comments