From 8759d5c864ffe287bc5e098c45bf6cce5d27dd9c Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Thu, 13 Jul 2017 15:13:36 +1000 Subject: [PATCH] Refactor Client: use one Rc instead of three --- src/lib.rs | 90 +++++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a33e0b27..72eefd2e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,7 +35,6 @@ use ruma_api::Endpoint; use tokio_core::reactor::Handle; use url::Url; -use api::r0::session::login; pub use error::Error; pub use session::Session; @@ -46,23 +45,27 @@ mod session; /// A client for the Matrix client-server API. #[derive(Debug)] -pub struct Client +pub struct Client(Rc>); + +/// Data contained in Client's Rc +#[derive(Debug)] +pub struct ClientData where C: Connect, { - homeserver_url: Rc, - hyper: Rc>, - session: Rc>>, + homeserver_url: Url, + hyper: HyperClient, + session: RefCell>, } impl Client { /// Creates a new client for making HTTP requests to the given homeserver. pub fn new(handle: &Handle, homeserver_url: Url, session: Option) -> Self { - Client { - homeserver_url: Rc::new(homeserver_url), - hyper: Rc::new(HyperClient::configure().keep_alive(true).build(handle)), - session: Rc::new(RefCell::new(session)), - } + Client(Rc::new(ClientData { + homeserver_url: homeserver_url, + hyper: HyperClient::configure().keep_alive(true).build(handle), + session: RefCell::new(session), + })) } } @@ -72,16 +75,16 @@ impl Client> { pub fn https(handle: &Handle, homeserver_url: Url, session: Option) -> Result { let connector = HttpsConnector::new(4, handle)?; - Ok(Client { - homeserver_url: Rc::new(homeserver_url), - hyper: Rc::new( + Ok(Client(Rc::new(ClientData { + homeserver_url: homeserver_url, + hyper: { HyperClient::configure() .connector(connector) .keep_alive(true) - .build(handle), - ), - session: Rc::new(RefCell::new(session)), - }) + .build(handle) + }, + session: RefCell::new(session), + }))) } } @@ -93,11 +96,11 @@ where /// /// This allows the user to configure the details of HTTP as desired. pub fn custom(hyper_client: HyperClient, homeserver_url: Url, session: Option) -> Self { - Client { - homeserver_url: Rc::new(homeserver_url), - hyper: Rc::new(hyper_client), - session: Rc::new(RefCell::new(session)), - } + Client(Rc::new(ClientData { + homeserver_url: homeserver_url, + hyper: hyper_client, + session: RefCell::new(session), + })) } /// Log in with a username and password. @@ -107,20 +110,19 @@ where /// returning it. pub fn log_in(&self, user: String, password: String) -> impl Future { - let request = login::Request { + use api::r0::session::login; + + let data = self.0.clone(); + + login::call(self.clone(), login::Request { address: None, login_type: login::LoginType::Password, medium: None, password, user, - }; - - let session = self.session.clone(); - - login::call(self.clone(), request).and_then(move |response| { - *session.borrow_mut() = Some(Session::new(response.access_token, response.user_id)); - - Ok(()) + }).map(move |response| { + *data.session.borrow_mut() = + Some(Session::new(response.access_token, response.user_id)); }) } @@ -130,7 +132,7 @@ where pub fn register_guest(&self) -> impl Future { use api::r0::account::register; - let session = self.session.clone(); + let data = self.0.clone(); register::call(self.clone(), register::Request { auth: None, @@ -141,7 +143,8 @@ where password: None, username: None, }).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 { use api::r0::account::register; - let session = self.session.clone(); + let data = self.0.clone(); register::call(self.clone(), register::Request { auth: None, @@ -171,7 +174,8 @@ where password: Some(password), username: username, }).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 E: Endpoint, { - let mut url = (*self.homeserver_url).clone(); - let hyper = self.hyper; - let session = self.session; + let data1 = self.0.clone(); + let data2 = self.0.clone(); + let mut url = self.0.homeserver_url.clone(); request .try_into() @@ -199,7 +203,7 @@ where url.set_query(uri.query()); 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()); } else { return Err(Error::AuthenticationRequired); @@ -214,7 +218,7 @@ where .and_then(move |(uri, mut hyper_request)| { hyper_request.set_uri(uri); - hyper + data2.hyper .request(hyper_request) .map_err(Error::from) }) @@ -226,10 +230,6 @@ where impl Clone for Client { fn clone(&self) -> Client { - Client { - homeserver_url: self.homeserver_url.clone(), - hyper: self.hyper.clone(), - session: self.session.clone(), - } + Client(self.0.clone()) } }