1use xso::{AsXml, FromXml};
8
9use crate::ns;
10
11#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
13#[xml(namespace = ns::TLS, name = "starttls")]
14pub struct Request;
15
16#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
18#[xml(namespace = ns::TLS, name = "proceed")]
19pub struct Proceed;
20
21#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
23#[xml(namespace = ns::TLS, name = "failure")]
24pub struct Failure;
25
26#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
30#[xml(namespace = ns::TLS, name = "starttls")]
31pub struct StartTls {
32    #[xml(flag)]
34    pub required: bool,
35}
36
37#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
39#[xml()]
40pub enum Nonza {
41    #[xml(transparent)]
43    Request(Request),
44
45    #[xml(transparent)]
47    Proceed(Proceed),
48
49    #[xml(transparent)]
51    Failure(Failure),
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57    use minidom::Element;
58
59    #[test]
60    fn test_size() {
61        assert_size!(Request, 0);
62        assert_size!(Proceed, 0);
63        assert_size!(StartTls, 1);
64        assert_size!(Nonza, 1);
65    }
66
67    #[test]
68    fn test_parsers() {
69        let elem: Element = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
70            .parse()
71            .unwrap();
72        let request = Request::try_from(elem.clone()).unwrap();
73        let elem2 = Element::from(request);
74        assert_eq!(elem, elem2);
75
76        let elem: Element = "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
77            .parse()
78            .unwrap();
79        let proceed = Proceed::try_from(elem.clone()).unwrap();
80        let elem2 = Element::from(proceed);
81        assert_eq!(elem, elem2);
82
83        let elem: Element = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
84            .parse()
85            .unwrap();
86        let starttls = StartTls::try_from(elem.clone()).unwrap();
87        assert_eq!(starttls.required, false);
88        let elem2 = Element::from(starttls);
89        assert_eq!(elem, elem2);
90
91        let elem: Element =
92            "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls>"
93                .parse()
94                .unwrap();
95        let starttls = StartTls::try_from(elem.clone()).unwrap();
96        assert_eq!(starttls.required, true);
97        let elem2 = Element::from(starttls);
98        assert_eq!(elem, elem2);
99
100        let elem: Element = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
101            .parse()
102            .unwrap();
103        let nonza = Nonza::try_from(elem.clone()).unwrap();
104        assert_eq!(nonza, Nonza::Request(Request));
105        let elem2 = Element::from(nonza);
106        assert_eq!(elem, elem2);
107
108        let elem: Element = "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
109            .parse()
110            .unwrap();
111        let nonza = Nonza::try_from(elem.clone()).unwrap();
112        assert_eq!(nonza, Nonza::Proceed(Proceed));
113        let elem2 = Element::from(nonza);
114        assert_eq!(elem, elem2);
115    }
116}