diff --git a/README.md b/README.md index bd6583c..6e8c49c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Create a client using and request guest login. ```rust let client = Client::new("https://ars.particify.de/api").expect("client created"); -client.guest_login().await; +let client = client.guest_login().await.expect("logged in"); ``` ### Request room information diff --git a/examples/arsnova-client-tui.rs b/examples/arsnova-client-tui.rs index cdfb40a..a632c48 100644 --- a/examples/arsnova-client-tui.rs +++ b/examples/arsnova-client-tui.rs @@ -55,14 +55,12 @@ pub struct Cli { async fn main() -> Result<(), ()> { let cli = Cli::parse(); - let mut client = match Client::new(&cli.url) { + let client = match Client::new(&cli.url) { Ok(client) => client, Err(_) => return Err(()), }; - if client.guest_login().await.is_err() { - return Err(()); - } + let client = client.guest_login().await.map_err(|_| ())?; let (tx, rx) = channel::(10); diff --git a/src/client.rs b/src/client.rs index 756f2df..3dcca44 100644 --- a/src/client.rs +++ b/src/client.rs @@ -19,6 +19,7 @@ use std::error; use std::fmt::{Display, Formatter}; +use std::marker::PhantomData; use std::time::Duration; use futures_util::{SinkExt, StreamExt}; @@ -199,10 +200,14 @@ impl Display for ClientError { impl error::Error for ClientError {} -pub struct Client { +pub struct LoggedIn; +pub struct LoggedOut; + +pub struct Client { api_url: String, http_client: reqwest::Client, token: Option, + state: PhantomData, } impl Client { @@ -216,10 +221,13 @@ impl Client { api_url: api_url.to_string(), http_client: client, token: None, + state: PhantomData::, }) } +} - pub async fn guest_login(&mut self) -> Result<(), ClientError> { +impl Client { + pub async fn guest_login(self) -> Result, ClientError> { match self .http_client .post(format!("{}/auth/login/guest", self.api_url)) @@ -227,15 +235,28 @@ impl Client { .await { Ok(res) => match res.json::().await { - Ok(res) => { - self.token = Some(res.token); - Ok(()) - } + Ok(res) => Ok(Client { + api_url: self.api_url, + http_client: self.http_client, + token: Some(res.token), + state: PhantomData::, + }), Err(_) => Err(LoginError), }, Err(_) => Err(ConnectionError), } } +} + +impl Client { + pub fn logout(self) -> Client { + Client { + api_url: self.api_url, + http_client: self.http_client, + token: None, + state: PhantomData::, + } + } pub async fn get_room_info(&self, short_id: &str) -> Result { let token = self.token.as_ref().unwrap();