88// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
99// See the Mulan PSL v2 for more details.
1010
11- use crate :: {
12- errors:: HttpClientError ,
13- request:: REQUEST_BUILDER_CLASS_NAME ,
14- utils:: { replace_and_get, replace_and_set} ,
15- } ;
11+ use crate :: { errors:: HttpClientError , request:: REQUEST_BUILDER_CLASS_NAME } ;
1612use phper:: {
1713 alloc:: ToRefOwned ,
1814 classes:: { ClassEntry , StatefulClass , Visibility } ,
1915 functions:: Argument ,
2016} ;
2117use reqwest:: blocking:: { Client , ClientBuilder } ;
22- use std:: time:: Duration ;
18+ use std:: { mem :: take , time:: Duration } ;
2319
2420const HTTP_CLIENT_BUILDER_CLASS_NAME : & str = "HttpClient\\ HttpClientBuilder" ;
2521const HTTP_CLIENT_CLASS_NAME : & str = "HttpClient\\ HttpClient" ;
2622
2723pub fn make_client_builder_class ( ) -> StatefulClass < ClientBuilder > {
24+ // `new_with_default_state` means initialize the state of `ClientBuilder` as
25+ // `Default::default`.
2826 let mut class = StatefulClass :: new_with_default_state ( HTTP_CLIENT_BUILDER_CLASS_NAME ) ;
2927
28+ // Inner call the `ClientBuilder::timeout`.
3029 class. add_method (
3130 "timeout" ,
3231 Visibility :: Public ,
3332 |this, arguments| {
3433 let ms = arguments[ 0 ] . expect_long ( ) ?;
35- let state: & mut ClientBuilder = this. as_mut_state ( ) ;
36- replace_and_set ( state, |builder| {
37- builder. timeout ( Duration :: from_millis ( ms as u64 ) )
38- } ) ;
34+ let state = this. as_mut_state ( ) ;
35+ let builder: ClientBuilder = take ( state) ;
36+ * state = builder. timeout ( Duration :: from_millis ( ms as u64 ) ) ;
3937 Ok :: < _ , HttpClientError > ( this. to_ref_owned ( ) )
4038 } ,
4139 vec ! [ Argument :: by_val( "ms" ) ] ,
4240 ) ;
4341
42+ // Inner call the `ClientBuilder::cookie_store`.
4443 class. add_method (
4544 "cookie_store" ,
4645 Visibility :: Public ,
4746 |this, arguments| {
4847 let enable = arguments[ 0 ] . expect_bool ( ) ?;
49- let state: & mut ClientBuilder = this. as_mut_state ( ) ;
50- replace_and_set ( state, |builder| builder. cookie_store ( enable) ) ;
48+ let state = this. as_mut_state ( ) ;
49+ let builder: ClientBuilder = take ( state) ;
50+ * state = builder. cookie_store ( enable) ;
5151 Ok :: < _ , HttpClientError > ( this. to_ref_owned ( ) )
5252 } ,
5353 vec ! [ Argument :: by_val( "enable" ) ] ,
5454 ) ;
5555
56+ // Inner call the `ClientBuilder::build`, and wrap the result `Client` in
57+ // Object.
5658 class. add_method (
5759 "build" ,
5860 Visibility :: Public ,
5961 |this, _arguments| {
60- let state = this. as_mut_state ( ) ;
61- let client = replace_and_get ( state , ClientBuilder :: build) ?;
62+ let state = take ( this. as_mut_state ( ) ) ;
63+ let client = ClientBuilder :: build ( state ) ?;
6264 let mut object = ClassEntry :: from_globals ( HTTP_CLIENT_CLASS_NAME ) ?. init_object ( ) ?;
6365 unsafe {
6466 * object. as_mut_state ( ) = Some ( client) ;
@@ -80,7 +82,7 @@ pub fn make_client_class() -> StatefulClass<Option<Client>> {
8082 "get" ,
8183 Visibility :: Public ,
8284 |this, arguments| {
83- let url = arguments[ 0 ] . as_z_str ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
85+ let url = arguments[ 0 ] . expect_z_str ( ) ? . to_str ( ) . unwrap ( ) ;
8486 let client = this. as_state ( ) . as_ref ( ) . unwrap ( ) ;
8587 let request_builder = client. get ( url) ;
8688 let mut object = ClassEntry :: from_globals ( REQUEST_BUILDER_CLASS_NAME ) ?. init_object ( ) ?;
@@ -96,7 +98,7 @@ pub fn make_client_class() -> StatefulClass<Option<Client>> {
9698 "post" ,
9799 Visibility :: Public ,
98100 |this, arguments| {
99- let url = arguments[ 0 ] . as_z_str ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
101+ let url = arguments[ 0 ] . expect_z_str ( ) ? . to_str ( ) . unwrap ( ) ;
100102 let client = this. as_state ( ) . as_ref ( ) . unwrap ( ) ;
101103 let request_builder = client. post ( url) ;
102104 let mut object = ClassEntry :: from_globals ( REQUEST_BUILDER_CLASS_NAME ) ?. init_object ( ) ?;
0 commit comments