summaryrefslogtreecommitdiffstats
path: root/src/client/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/mod.rs')
-rw-r--r--src/client/mod.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/client/mod.rs b/src/client/mod.rs
new file mode 100644
index 0000000..fe3dd34
--- /dev/null
+++ b/src/client/mod.rs
@@ -0,0 +1,40 @@
+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>>;
+// }