serialize Vec and Option<Vec>

fix #5
This commit is contained in:
Marc-Antoine Arnaud
2018-11-05 17:02:37 +01:00
parent 9cab498963
commit 96bac71db5
4 changed files with 79 additions and 39 deletions

View File

@@ -23,14 +23,14 @@ pub fn serialize(
}
let renamed_label = match field_attrs.rename {
Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())),
None => field.ident.clone(),
Some(value) => Ident::new(&format!("{}", value), Span::call_site()),
None => field.ident.clone().unwrap(),
};
let label = &field.ident;
let label_name = if let Some(prefix) = field_attrs.prefix {
prefix + ":" + renamed_label.unwrap().to_string().as_ref()
prefix + ":" + renamed_label.to_string().as_ref()
} else {
renamed_label.unwrap().to_string()
renamed_label.to_string()
};
match get_field_type(field) {
@@ -93,6 +93,20 @@ pub fn serialize(
struct_start_event
};
}),
Some(&FieldType::FieldTypeVec{..}) => {
Some(quote!{
for item in &self.#label {
let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event);
let data_event = XmlEvent::characters(item);
let _ret = writer.write(data_event);
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event);
}
})
}
_ => None,
}
}
@@ -153,14 +167,14 @@ pub fn serialize(
}
let renamed_label = match field_attrs.rename {
Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())),
None => field.ident.clone(),
Some(value) => Ident::new(&format!("{}", value), Span::call_site()),
None => field.ident.clone().unwrap(),
};
let label_name = if let Some(prefix) = field_attrs.prefix {
prefix + ":" + renamed_label.unwrap().to_string().as_ref()
prefix + ":" + renamed_label.to_string().as_ref()
} else {
renamed_label.unwrap().to_string()
renamed_label.to_string()
};
match get_field_type(field) {
@@ -233,18 +247,35 @@ pub fn serialize(
let _ret = writer.write(end_event);
}
}),
Some(&FieldType::FieldTypeVec{ .. }) => Some(quote!{
if let Some(ref items) = &self.#label {
for item in items.iter() {
let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event);
let value = format!("{}", item);
let data_event = XmlEvent::characters(&value);
let _ret = writer.write(data_event);
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event);
}
}
}),
_ => None,
}
}
Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{
writer.set_skip_start_end(false);
match self.#label.serialize(writer) {
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
}),
Some(FieldType::FieldTypeStruct { .. }) => {
Some(quote!{
writer.set_skip_start_end(false);
match self.#label.serialize(writer) {
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
})
},
Some(FieldType::FieldTypeVec { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
@@ -313,7 +344,7 @@ pub fn serialize(
unimplemented!();
}
}
}
},
None => None,
}
})