aboutsummaryrefslogtreecommitdiffstats
path: root/stanza/src/starttls.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stanza/src/starttls.rs')
-rw-r--r--stanza/src/starttls.rs94
1 files changed, 94 insertions, 0 deletions
diff --git a/stanza/src/starttls.rs b/stanza/src/starttls.rs
new file mode 100644
index 0000000..fb66711
--- /dev/null
+++ b/stanza/src/starttls.rs
@@ -0,0 +1,94 @@
+use std::collections::{HashMap, HashSet};
+
+use peanuts::{
+ element::{Content, FromElement, IntoElement, Name, NamespaceDeclaration},
+ Element,
+};
+
+pub const XMLNS: &str = "urn:ietf:params:xml:ns:xmpp-tls";
+
+#[derive(Debug, Clone)]
+pub struct StartTls {
+ pub required: bool,
+}
+
+impl IntoElement for StartTls {
+ fn builder(&self) -> peanuts::element::ElementBuilder {
+ let mut builder = Element::builder("starttls", Some(XMLNS));
+
+ if self.required {
+ builder = builder.push_child(Required)
+ }
+
+ builder
+ }
+}
+
+impl FromElement for StartTls {
+ fn from_element(
+ mut element: peanuts::Element,
+ ) -> std::result::Result<StartTls, peanuts::DeserializeError> {
+ element.check_name("starttls")?;
+ element.check_namespace(XMLNS)?;
+
+ let mut required = false;
+ if let Some(_) = element.child_opt::<Required>()? {
+ required = true;
+ }
+
+ Ok(StartTls { required })
+ }
+}
+
+#[derive(Debug)]
+pub struct Required;
+
+impl FromElement for Required {
+ fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> {
+ element.check_name("required")?;
+ element.check_namespace(XMLNS)?;
+
+ Ok(Required)
+ }
+}
+
+impl IntoElement for Required {
+ fn builder(&self) -> peanuts::element::ElementBuilder {
+ Element::builder("required", Some(XMLNS))
+ }
+}
+
+#[derive(Debug)]
+pub struct Proceed;
+
+impl IntoElement for Proceed {
+ fn builder(&self) -> peanuts::element::ElementBuilder {
+ Element::builder("proceed", Some(XMLNS))
+ }
+}
+
+impl FromElement for Proceed {
+ fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> {
+ element.check_name("proceed")?;
+ element.check_namespace(XMLNS)?;
+
+ Ok(Proceed)
+ }
+}
+
+pub struct Failure;
+
+impl IntoElement for Failure {
+ fn builder(&self) -> peanuts::element::ElementBuilder {
+ Element::builder("failure", Some(XMLNS))
+ }
+}
+
+impl FromElement for Failure {
+ fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> {
+ element.check_name("failure")?;
+ element.check_namespace(XMLNS)?;
+
+ Ok(Failure)
+ }
+}