@@ -9,8 +9,6 @@ use self::sql::*;
99use  crate :: { cfg,  err:: Error ,  plugins:: LeetCode } ; 
1010use  diesel:: prelude:: * ; 
1111use  serde_json:: Value ; 
12- use  reqwest:: Error  as  ReqwestError ; 
13- 
1412
1513/// sqlite connection 
1614pub  fn  conn ( p :  String )  -> SqliteConnection  { 
@@ -30,32 +28,16 @@ impl Cache {
3028
3129    /// Clean cache 
3230     pub  fn  clean ( & self )  -> Result < ( ) ,  Error >  { 
33-         let  res = std:: fs:: remove_file ( & self . 0 . conf . storage . cache ( ) ) ; 
34-         if  res. is_err ( )  { 
35-             let  err = res. err ( ) . unwrap ( ) ; 
36-             error ! ( "{:?}" ,  Error :: CacheError ( format!( "clean local cache failed -> {}" ,  & err) ) ) ; 
37-             return  Err ( Error :: CacheError ( format ! ( "clean local cache failed -> {}" ,  & err) ) ) ; 
38-         } 
39-         
40-         Ok ( ( ) ) 
31+         Ok ( std:: fs:: remove_file ( & self . 0 . conf . storage . cache ( ) ) ?) 
4132    } 
4233
4334    /// ref to download probems 
4435     pub  fn  update ( self )  -> Result < ( ) ,  Error >  { 
4536        let  c = conn ( ( & self . 0 . conf . storage . cache ( ) ) . to_owned ( ) ) ; 
46-         let  res = self . download_problems ( ) ; 
47-         if  res. is_err ( )  { 
48-             return  Err ( res. err ( ) . unwrap ( ) ) ; 
49-         } 
50-         
51-         for  i in  res. unwrap ( ) . into_iter ( )  { 
37+         let  ps = self . download_problems ( ) ?; 
38+         for  i in  ps. into_iter ( )  { 
5239            let  target = problems. filter ( id. eq ( i. id ) ) ; 
53-             let  u_res = diesel:: update ( target) . set ( i. to_owned ( ) ) . execute ( & c) ; 
54-             if  u_res. is_err ( )  { 
55-                 let  err = u_res. err ( ) . unwrap ( ) ; 
56-                 error ! ( "{:?}" ,  Error :: CacheError ( format!( "Update cache failed -> {}" ,  & err) ) ) ; 
57-                 return  Err ( Error :: CacheError ( format ! ( "Update cache failed -> {}" ,  & err) ) ) ; 
58-             } 
40+             diesel:: update ( target) . set ( i. to_owned ( ) ) . execute ( & c) ?; 
5941        } 
6042
6143        Ok ( ( ) ) 
@@ -67,42 +49,14 @@ impl Cache {
6749        let  mut  ps:  Vec < Problem >  = vec ! [ ] ; 
6850
6951        for  i in  & self . 0 . conf . sys . categories . to_owned ( )  { 
70-             let  res = self . 0 . clone ( ) . get_category_problems ( & i) ; 
71- 
72-             if  res. is_err ( )  { 
73-                 return  Err ( res. err ( ) . unwrap ( ) ) ; 
74-             } 
75- 
76-             let  json:  Result < Value ,  ReqwestError >  = res. unwrap ( ) . json ( ) ; 
77-             if  json. is_err ( )  { 
78-                 error ! ( "{:?}" ,  Error :: DownloadError ( format!( "category {}" ,  & i) ) ) ; 
79-                 return  Err ( Error :: DownloadError ( format ! ( "category {}" ,  & i) ) ) ; 
80-             } 
81- 
82-             // get "stat_status_pairs" from respnonse 
83-             let  res = parser:: parse_problem ( & mut  ps,  json. unwrap ( ) ) ; 
84-             if  res. is_err ( )  { 
85-                 error ! ( "{:?}" ,  Error :: DownloadError ( format!( "category {}" ,  & i) ) ) ; 
86-                 return  Err ( Error :: DownloadError ( format ! ( "category {}" ,  & i) ) ) ; 
87-             } 
88-         } 
89- 
90-         // store problems into database 
91-         let  j = serde_json:: to_string ( & ps) ; 
92-         if  j. is_err ( )  { 
93-             error ! ( "{:?}" ,  Error :: ParseError ( "data from cache" ) ) ; 
94-             return  Err ( Error :: ParseError ( "data from cache" ) ) ; 
52+             let  json = self . 0 . clone ( ) . get_category_problems ( & i) ?. json ( ) ?; 
53+             parser:: problem ( & mut  ps,  json) ?
9554        } 
9655
97-         let  count = self . get_problems ( ) . unwrap ( ) . len ( ) ; 
56+         let  count = self . get_problems ( ) ? . len ( ) ; 
9857        if  count == 0  { 
99-             ps. sort_by ( |a,  b| b. id . partial_cmp ( & a. id ) . unwrap ( ) ) ; 
100-             let  res = diesel:: insert_into ( problems) . values ( & ps) . execute ( & self . conn ( ) ) ; 
101-             if  res. is_err ( )  { 
102-                 let  err = res. err ( ) . unwrap ( ) ; 
103-                 error ! ( "{:?}" ,  Error :: CacheError ( format!( "Save to cache failed -> {}" ,  & err) ) ) ; 
104-                 return  Err ( Error :: CacheError ( format ! ( "Save to cache failed -> {}" ,  & err) ) ) ; 
105-             } 
58+             ps. sort_by ( |a,  b| b. id . partial_cmp ( & a. id ) . unwrap_or ( std:: cmp:: Ordering :: Equal ) ) ; 
59+             diesel:: insert_into ( problems) . values ( & ps) . execute ( & self . conn ( ) ) ?; 
10660        } 
10761
10862        Ok ( ps) 
@@ -128,32 +82,15 @@ impl Cache {
12882    /// Get problems from cache 
12983     /// 
13084     /// if cache doesn't exist, request a new copy 
131-      /// 
132-      /// [TODO]: 
133-      ///  1. make downloading async 
13485     pub  fn  get_problems ( & self )  -> Result < Vec < Problem > ,  Error >  { 
135-         let  res = problems. load :: < Problem > ( & self . conn ( ) ) ; 
136-         if  res. is_err ( )  { 
137-             let  err = res. err ( ) . unwrap ( ) ; 
138-             warn ! ( "Select problems from cache failed -> {:?} -> try downloading" ,  & err) ; 
139-             return  Err ( Error :: CacheError ( 
140-                 format ! ( "Select problems from cache failed -> {:?} -> try downloading" ,  & err) 
141-             ) ) ; 
142-         } 
143-         
144-         Ok ( res. unwrap ( ) ) 
86+         Ok ( problems. load :: < Problem > ( & self . conn ( ) ) ?) 
14587    } 
14688
14789    /// New cache 
14890     pub  fn  new ( )  -> Result < Self ,  Error >  { 
14991        let  conf = cfg:: locate ( ) ; 
15092        let  c = conn ( conf. storage . cache ( ) ) ; 
151-         let  r = diesel:: sql_query ( CREATE_PROBLEMS_IF_NOT_EXISTS ) . execute ( & c) ; 
152-         if  r. is_err ( )  { 
153-             let  err = r. err ( ) . unwrap ( ) ; 
154-             error ! ( "{:?}" ,  Error :: CacheError ( format!( "Create local cache failed -> {}" ,  & err) ) ) ; 
155-             return  Err ( Error :: CacheError ( format ! ( "Create local cache failed -> {}" ,  & err) ) ) ; 
156-         } 
93+         diesel:: sql_query ( CREATE_PROBLEMS_IF_NOT_EXISTS ) . execute ( & c) ?; 
15794
15895        Ok ( Cache ( LeetCode :: new ( ) ) ) 
15996    } 
0 commit comments