41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
|
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<encrypted::JabberClient<'j>> {
|
||
|
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<Vec<StreamFeatures>>;
|
||
|
// }
|