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 
4545     pub  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