use async_trait::async_trait; pub use crate::model::{ Conversation, Message, ConversationID, MessageID, }; use crate::model::JwtToken; pub mod http_client; pub use http_client::HTTPAPIClient; use self::http_client::Credentials; #[async_trait] pub trait APIInterface { type Error; // (GET) /version async fn get_version(&mut self) -> Result; // (GET) /conversations async fn get_conversations(&mut self) -> Result, Self::Error>; // (GET) /messages async fn get_messages( &mut self, conversation_id: &ConversationID, limit: Option, before: Option, after: Option, ) -> Result, Self::Error>; // (POST) /authenticate async fn authenticate(&mut self, credentials: Credentials) -> Result; } #[async_trait] pub trait TokenStore { async fn get_token(&mut self) -> Option; async fn set_token(&mut self, token: JwtToken); } pub struct InMemoryTokenStore { token: Option, } impl Default for InMemoryTokenStore { fn default() -> Self { Self::new() } } impl InMemoryTokenStore { pub fn new() -> Self { Self { token: None } } } #[async_trait] impl TokenStore for InMemoryTokenStore { async fn get_token(&mut self) -> Option { self.token.clone() } async fn set_token(&mut self, token: JwtToken) { self.token = Some(token); } }