pub mod encrypted; pub mod unencrypted; // use async_trait::async_trait; use crate::stanza::stream::StreamFeature; use crate::JabberError; use crate::Result; pub enum JabberClientType<'j> { Encrypted(encrypted::JabberClient<'j>), Unencrypted(unencrypted::JabberClient<'j>), } impl<'j> JabberClientType<'j> { pub async fn ensure_tls(self) -> Result> { match self { Self::Encrypted(mut c) => { c.start_stream(); Ok(c) } Self::Unencrypted(mut c) => { c.start_stream().await?; let features = c.get_features().await?; if features.contains(&StreamFeature::StartTls) { Ok(c.starttls().await?) } else { Err(JabberError::StartTlsUnavailable) } } } } } // TODO: jabber client trait over both client types // #[async_trait] // pub trait JabberTrait { // async fn start_stream(&mut self) -> Result<()>; // async fn get_features(&self) -> Result>; // }