// 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> { /// ensures an encrypted jabber client pub async fn ensure_tls(self) -> Result> { match self { Self::Encrypted(c) => 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 using macro // #[async_trait] // pub trait JabberTrait { // async fn start_stream(&mut self) -> Result<()>; // async fn get_features(&self) -> Result>; // }