Refactor Client: use one Rc instead of three
This commit is contained in:
		
							parent
							
								
									002745fb2f
								
							
						
					
					
						commit
						8759d5c864
					
				
							
								
								
									
										90
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								src/lib.rs
									
									
									
									
									
								
							| @ -35,7 +35,6 @@ use ruma_api::Endpoint; | |||||||
| use tokio_core::reactor::Handle; | use tokio_core::reactor::Handle; | ||||||
| use url::Url; | use url::Url; | ||||||
| 
 | 
 | ||||||
| use api::r0::session::login; |  | ||||||
| pub use error::Error; | pub use error::Error; | ||||||
| pub use session::Session; | pub use session::Session; | ||||||
| 
 | 
 | ||||||
| @ -46,23 +45,27 @@ mod session; | |||||||
| 
 | 
 | ||||||
| /// A client for the Matrix client-server API.
 | /// A client for the Matrix client-server API.
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct Client<C> | pub struct Client<C: Connect>(Rc<ClientData<C>>); | ||||||
|  | 
 | ||||||
|  | /// Data contained in Client's Rc
 | ||||||
|  | #[derive(Debug)] | ||||||
|  | pub struct ClientData<C> | ||||||
| where | where | ||||||
|     C: Connect, |     C: Connect, | ||||||
| { | { | ||||||
|     homeserver_url: Rc<Url>, |     homeserver_url: Url, | ||||||
|     hyper: Rc<HyperClient<C>>, |     hyper: HyperClient<C>, | ||||||
|     session: Rc<RefCell<Option<Session>>>, |     session: RefCell<Option<Session>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Client<HttpConnector> { | impl Client<HttpConnector> { | ||||||
|     /// Creates a new client for making HTTP requests to the given homeserver.
 |     /// Creates a new client for making HTTP requests to the given homeserver.
 | ||||||
|     pub fn new(handle: &Handle, homeserver_url: Url, session: Option<Session>) -> Self { |     pub fn new(handle: &Handle, homeserver_url: Url, session: Option<Session>) -> Self { | ||||||
|         Client { |         Client(Rc::new(ClientData { | ||||||
|             homeserver_url: Rc::new(homeserver_url), |             homeserver_url: homeserver_url, | ||||||
|             hyper: Rc::new(HyperClient::configure().keep_alive(true).build(handle)), |             hyper: HyperClient::configure().keep_alive(true).build(handle), | ||||||
|             session: Rc::new(RefCell::new(session)), |             session: RefCell::new(session), | ||||||
|         } |         })) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -72,16 +75,16 @@ impl Client<HttpsConnector<HttpConnector>> { | |||||||
|     pub fn https(handle: &Handle, homeserver_url: Url, session: Option<Session>) -> Result<Self, NativeTlsError> { |     pub fn https(handle: &Handle, homeserver_url: Url, session: Option<Session>) -> Result<Self, NativeTlsError> { | ||||||
|         let connector = HttpsConnector::new(4, handle)?; |         let connector = HttpsConnector::new(4, handle)?; | ||||||
| 
 | 
 | ||||||
|         Ok(Client { |         Ok(Client(Rc::new(ClientData { | ||||||
|             homeserver_url: Rc::new(homeserver_url), |             homeserver_url: homeserver_url, | ||||||
|             hyper: Rc::new( |             hyper: { | ||||||
|                 HyperClient::configure() |                 HyperClient::configure() | ||||||
|                     .connector(connector) |                     .connector(connector) | ||||||
|                     .keep_alive(true) |                     .keep_alive(true) | ||||||
|                     .build(handle), |                     .build(handle) | ||||||
|             ), |             }, | ||||||
|             session: Rc::new(RefCell::new(session)), |             session: RefCell::new(session), | ||||||
|         }) |         }))) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -93,11 +96,11 @@ where | |||||||
|     ///
 |     ///
 | ||||||
|     /// This allows the user to configure the details of HTTP as desired.
 |     /// This allows the user to configure the details of HTTP as desired.
 | ||||||
|     pub fn custom(hyper_client: HyperClient<C>, homeserver_url: Url, session: Option<Session>) -> Self { |     pub fn custom(hyper_client: HyperClient<C>, homeserver_url: Url, session: Option<Session>) -> Self { | ||||||
|         Client { |         Client(Rc::new(ClientData { | ||||||
|             homeserver_url: Rc::new(homeserver_url), |             homeserver_url: homeserver_url, | ||||||
|             hyper: Rc::new(hyper_client), |             hyper: hyper_client, | ||||||
|             session: Rc::new(RefCell::new(session)), |             session: RefCell::new(session), | ||||||
|         } |         })) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Log in with a username and password.
 |     /// Log in with a username and password.
 | ||||||
| @ -107,20 +110,19 @@ where | |||||||
|     /// returning it.
 |     /// returning it.
 | ||||||
|     pub fn log_in(&self, user: String, password: String) |     pub fn log_in(&self, user: String, password: String) | ||||||
|     -> impl Future<Item = (), Error = Error> { |     -> impl Future<Item = (), Error = Error> { | ||||||
|         let request = login::Request { |         use api::r0::session::login; | ||||||
|  | 
 | ||||||
|  |         let data = self.0.clone(); | ||||||
|  | 
 | ||||||
|  |         login::call(self.clone(), login::Request { | ||||||
|             address: None, |             address: None, | ||||||
|             login_type: login::LoginType::Password, |             login_type: login::LoginType::Password, | ||||||
|             medium: None, |             medium: None, | ||||||
|             password, |             password, | ||||||
|             user, |             user, | ||||||
|         }; |         }).map(move |response| { | ||||||
| 
 |             *data.session.borrow_mut() = | ||||||
|         let session = self.session.clone(); |                 Some(Session::new(response.access_token, response.user_id)); | ||||||
| 
 |  | ||||||
|         login::call(self.clone(), request).and_then(move |response| { |  | ||||||
|             *session.borrow_mut() = Some(Session::new(response.access_token, response.user_id)); |  | ||||||
| 
 |  | ||||||
|             Ok(()) |  | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -130,7 +132,7 @@ where | |||||||
|     pub fn register_guest(&self) -> impl Future<Item = (), Error = Error> { |     pub fn register_guest(&self) -> impl Future<Item = (), Error = Error> { | ||||||
|         use api::r0::account::register; |         use api::r0::account::register; | ||||||
| 
 | 
 | ||||||
|         let session = self.session.clone(); |         let data = self.0.clone(); | ||||||
| 
 | 
 | ||||||
|         register::call(self.clone(), register::Request { |         register::call(self.clone(), register::Request { | ||||||
|             auth: None, |             auth: None, | ||||||
| @ -141,7 +143,8 @@ where | |||||||
|             password: None, |             password: None, | ||||||
|             username: None, |             username: None, | ||||||
|         }).map(move |response| { |         }).map(move |response| { | ||||||
|             *session.borrow_mut() = Some(Session::new(response.access_token, response.user_id)); |             *data.session.borrow_mut() = | ||||||
|  |                 Some(Session::new(response.access_token, response.user_id)); | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -160,7 +163,7 @@ where | |||||||
|     ) -> impl Future<Item = (), Error = Error> { |     ) -> impl Future<Item = (), Error = Error> { | ||||||
|         use api::r0::account::register; |         use api::r0::account::register; | ||||||
| 
 | 
 | ||||||
|         let session = self.session.clone(); |         let data = self.0.clone(); | ||||||
| 
 | 
 | ||||||
|         register::call(self.clone(), register::Request { |         register::call(self.clone(), register::Request { | ||||||
|             auth: None, |             auth: None, | ||||||
| @ -171,7 +174,8 @@ where | |||||||
|             password: Some(password), |             password: Some(password), | ||||||
|             username: username, |             username: username, | ||||||
|         }).map(move |response| { |         }).map(move |response| { | ||||||
|             *session.borrow_mut() = Some(Session::new(response.access_token, response.user_id)); |             *data.session.borrow_mut() = | ||||||
|  |                 Some(Session::new(response.access_token, response.user_id)); | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -183,9 +187,9 @@ where | |||||||
|     where |     where | ||||||
|         E: Endpoint, |         E: Endpoint, | ||||||
|     { |     { | ||||||
|         let mut url = (*self.homeserver_url).clone(); |         let data1 = self.0.clone(); | ||||||
|         let hyper = self.hyper; |         let data2 = self.0.clone(); | ||||||
|         let session = self.session; |         let mut url = self.0.homeserver_url.clone(); | ||||||
| 
 | 
 | ||||||
|         request |         request | ||||||
|             .try_into() |             .try_into() | ||||||
| @ -199,7 +203,7 @@ where | |||||||
|                     url.set_query(uri.query()); |                     url.set_query(uri.query()); | ||||||
| 
 | 
 | ||||||
|                     if E::METADATA.requires_authentication { |                     if E::METADATA.requires_authentication { | ||||||
|                         if let Some(ref session) = *session.borrow() { |                         if let Some(ref session) = *data1.session.borrow() { | ||||||
|                             url.query_pairs_mut().append_pair("access_token", session.access_token()); |                             url.query_pairs_mut().append_pair("access_token", session.access_token()); | ||||||
|                         } else { |                         } else { | ||||||
|                             return Err(Error::AuthenticationRequired); |                             return Err(Error::AuthenticationRequired); | ||||||
| @ -214,7 +218,7 @@ where | |||||||
|             .and_then(move |(uri, mut hyper_request)| { |             .and_then(move |(uri, mut hyper_request)| { | ||||||
|                 hyper_request.set_uri(uri); |                 hyper_request.set_uri(uri); | ||||||
| 
 | 
 | ||||||
|                 hyper |                 data2.hyper | ||||||
|                     .request(hyper_request) |                     .request(hyper_request) | ||||||
|                     .map_err(Error::from) |                     .map_err(Error::from) | ||||||
|             }) |             }) | ||||||
| @ -226,10 +230,6 @@ where | |||||||
| 
 | 
 | ||||||
| impl<C: Connect> Clone for Client<C> { | impl<C: Connect> Clone for Client<C> { | ||||||
|     fn clone(&self) -> Client<C> { |     fn clone(&self) -> Client<C> { | ||||||
|         Client { |         Client(self.0.clone()) | ||||||
|             homeserver_url: self.homeserver_url.clone(), |  | ||||||
|             hyper: self.hyper.clone(), |  | ||||||
|             session: self.session.clone(), |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user