xso-proc: add debug mode for development purposes

Jonas Schรคfer created

Change summary

xso-proc/src/lib.rs     |  8 ++++++++
xso-proc/src/meta.rs    | 11 +++++++++++
xso-proc/src/structs.rs |  8 ++++++++
3 files changed, 27 insertions(+)

Detailed changes

xso-proc/src/lib.rs ๐Ÿ”—

@@ -90,6 +90,10 @@ fn from_xml_impl(input: Item) -> Result<TokenStream> {
         }
     });
 
+    if def.debug() {
+        println!("{}", result);
+    }
+
     Ok(result)
 }
 
@@ -151,6 +155,10 @@ fn into_xml_impl(input: Item) -> Result<TokenStream> {
         }
     });
 
+    if def.debug() {
+        println!("{}", result);
+    }
+
     Ok(result)
 }
 

xso-proc/src/meta.rs ๐Ÿ”—

@@ -154,6 +154,9 @@ pub(crate) struct XmlCompoundMeta {
 
     /// The value assigned to `name` inside `#[xml(..)]`, if any.
     pub(crate) name: Option<NameRef>,
+
+    /// The debug flag.
+    pub(crate) debug: Flag,
 }
 
 impl XmlCompoundMeta {
@@ -164,6 +167,7 @@ impl XmlCompoundMeta {
     fn parse_from_attribute(attr: &Attribute) -> Result<Self> {
         let mut namespace = None;
         let mut name = None;
+        let mut debug = Flag::Absent;
 
         attr.parse_nested_meta(|meta| {
             if meta.path.is_ident("name") {
@@ -178,6 +182,12 @@ impl XmlCompoundMeta {
                 }
                 namespace = Some(meta.value()?.parse()?);
                 Ok(())
+            } else if meta.path.is_ident("debug") {
+                if debug.is_set() {
+                    return Err(Error::new_spanned(meta.path, "duplicate `debug` key"));
+                }
+                debug = (&meta.path).into();
+                Ok(())
             } else {
                 Err(Error::new_spanned(meta.path, "unsupported key"))
             }
@@ -187,6 +197,7 @@ impl XmlCompoundMeta {
             span: attr.span(),
             namespace,
             name,
+            debug,
         })
     }
 

xso-proc/src/structs.rs ๐Ÿ”—

@@ -56,6 +56,9 @@ pub(crate) struct StructDef {
 
     /// Name of the iterator type.
     event_iter_ty_ident: Ident,
+
+    /// Flag whether debug mode is enabled.
+    debug: bool,
 }
 
 impl StructDef {
@@ -76,6 +79,7 @@ impl StructDef {
             target_ty_ident: ident.clone(),
             builder_ty_ident: quote::format_ident!("{}FromXmlBuilder", ident),
             event_iter_ty_ident: quote::format_ident!("{}IntoXmlIterator", ident),
+            debug: meta.debug.is_set(),
         })
     }
 
@@ -172,4 +176,8 @@ impl StructDef {
             event_iter_ty_ident: event_iter_ty_ident.clone(),
         })
     }
+
+    pub(crate) fn debug(&self) -> bool {
+        self.debug
+    }
 }