From f5a0a53d271f8bc3bf8f0fca35559d59b6e3ca21 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Mon, 9 Apr 2018 19:38:05 +0200 Subject: [PATCH] check operator and define common method to get attribute value --- yaserde_derive/src/der/attribute.rs | 37 +++++++++++++++-------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/yaserde_derive/src/der/attribute.rs b/yaserde_derive/src/der/attribute.rs index 156c12a..996b915 100644 --- a/yaserde_derive/src/der/attribute.rs +++ b/yaserde_derive/src/der/attribute.rs @@ -1,5 +1,7 @@ +use proc_macro2::TokenTreeIter; use proc_macro2::TokenNode::*; +use proc_macro2::Spacing; use proc_macro2::Delimiter::Parenthesis; use syn::Attribute; @@ -11,7 +13,22 @@ pub struct YaSerdeAttribute { pub text: bool, } +fn get_value(iter: &mut TokenTreeIter) -> Option { + match (iter.next(), iter.next()) { + (Some(operator), Some(value)) => { + match (operator.kind, value.kind) { + (Op('=', Spacing::Alone), Literal(l)) => { + Some(l.to_string().replace("\"", "")) + }, + _ => None, + } + }, + _ => None, + } +} + impl YaSerdeAttribute { + pub fn parse(attrs: &Vec) -> YaSerdeAttribute { let mut root = None; @@ -32,26 +49,10 @@ impl YaSerdeAttribute { Term(t) => { match t.as_str() { "root" => { - attr_iter.next(); - let v = attr_iter.next().map(|s| - match s.kind { - Literal(l) => { - Some(l.to_string().replace("\"", "")) - }, - _ => None - }); - root = v.unwrap_or(None); + root = get_value(&mut attr_iter); }, "rename" => { - attr_iter.next(); - let v = attr_iter.next().map(|s| - match s.kind { - Literal(l) => { - Some(l.to_string().replace("\"", "")) - }, - _ => None - }); - rename = v.unwrap_or(None); + rename = get_value(&mut attr_iter); }, "attribute" => { attribute = true;