jingle: Wrap the disposition in a struct, to get better type safety.

Emmanuel Gil Peyrot created

Change summary

src/jingle.rs | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)

Detailed changes

src/jingle.rs 🔗

@@ -45,10 +45,19 @@ generate_attribute!(Senders, "senders", {
 
 generate_id!(ContentId);
 
+// TODO: the list of values is defined, use an enum!
+generate_id!(Disposition);
+
+impl Default for Disposition {
+    fn default() -> Disposition {
+        Disposition(String::from("session"))
+    }
+}
+
 #[derive(Debug, Clone)]
 pub struct Content {
     pub creator: Creator,
-    pub disposition: String, // TODO: the list of values is defined, use an enum!
+    pub disposition: Disposition,
     pub name: ContentId,
     pub senders: Senders,
     pub description: Option<Element>,
@@ -66,7 +75,7 @@ impl TryFrom<Element> for Content {
 
         let mut content = Content {
             creator: get_attr!(elem, "creator", required),
-            disposition: get_attr!(elem, "disposition", optional).unwrap_or(String::from("session")),
+            disposition: get_attr!(elem, "disposition", default),
             name: get_attr!(elem, "name", required),
             senders: get_attr!(elem, "senders", default),
             description: None,
@@ -344,7 +353,7 @@ mod tests {
         assert_eq!(jingle.contents[0].creator, Creator::Initiator);
         assert_eq!(jingle.contents[0].name, ContentId(String::from("coucou")));
         assert_eq!(jingle.contents[0].senders, Senders::Both);
-        assert_eq!(jingle.contents[0].disposition, "session");
+        assert_eq!(jingle.contents[0].disposition, Disposition(String::from("session")));
 
         let elem: Element = "<jingle xmlns='urn:xmpp:jingle:1' action='session-initiate' sid='coucou'><content creator='initiator' name='coucou' senders='both'><description/><transport/></content></jingle>".parse().unwrap();
         let jingle = Jingle::try_from(elem).unwrap();
@@ -352,7 +361,7 @@ mod tests {
 
         let elem: Element = "<jingle xmlns='urn:xmpp:jingle:1' action='session-initiate' sid='coucou'><content creator='initiator' name='coucou' disposition='early-session'><description/><transport/></content></jingle>".parse().unwrap();
         let jingle = Jingle::try_from(elem).unwrap();
-        assert_eq!(jingle.contents[0].disposition, "early-session");
+        assert_eq!(jingle.contents[0].disposition, Disposition(String::from("early-session")));
     }
 
     #[test]