support Option type value

This commit is contained in:
Marc-Antoine Arnaud
2018-05-29 16:20:18 +02:00
parent ef37615458
commit 266b77428b
8 changed files with 714 additions and 47 deletions

View File

@@ -46,7 +46,7 @@ pub fn serialize(
| Some(FieldType::FieldTypeU64)
| Some(FieldType::FieldTypeF32)
| Some(FieldType::FieldTypeF64) => Some(quote!{
.attr(#label_name, &*{
let struct_start_event = struct_start_event.attr(#label_name, &*{
use std::mem;
unsafe {
let content = format!("{}", self.#label);
@@ -54,11 +54,50 @@ pub fn serialize(
mem::forget(content);
ret
}
})
});
}),
Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString) => Some(quote!{
let struct_start_event =
if let Some(ref value) = self.#label {
struct_start_event.attr(#label_name, &value)
} else {
struct_start_event
};
}),
Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8)
| Some(&FieldType::FieldTypeI16)
| Some(&FieldType::FieldTypeU16)
| Some(&FieldType::FieldTypeI32)
| Some(&FieldType::FieldTypeU32)
| Some(&FieldType::FieldTypeI64)
| Some(&FieldType::FieldTypeU64)
| Some(&FieldType::FieldTypeF32)
| Some(&FieldType::FieldTypeF64) => Some(quote!{
let struct_start_event =
if let Some(value) = self.#label {
struct_start_event.attr(#label_name, &*{
use std::mem;
unsafe {
let content = format!("{}", value);
let ret : &'static str = mem::transmute(&content as &str);
mem::forget(content);
ret
}
})
} else {
struct_start_event
};
}),
_ => None,
}
}
Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{
.attr(#label_name, &*{
let struct_start_event = struct_start_event.attr(#label_name, &*{
use std::mem;
match yaserde::ser::to_string_content(&self.#label) {
Ok(value) => {
@@ -70,7 +109,7 @@ pub fn serialize(
},
Err(msg) => return Err("Unable to serialize content".to_owned()),
}
})
});
}),
_ => None,
}
@@ -156,6 +195,47 @@ pub fn serialize(
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event);
}),
Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString) => Some(quote!{
if let Some(ref item) = 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);
}
}),
Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8)
| Some(&FieldType::FieldTypeI16)
| Some(&FieldType::FieldTypeU16)
| Some(&FieldType::FieldTypeI32)
| Some(&FieldType::FieldTypeU32)
| Some(&FieldType::FieldTypeI64)
| Some(&FieldType::FieldTypeU64)
| Some(&FieldType::FieldTypeF32)
| Some(&FieldType::FieldTypeF64) => Some(quote!{
if let Some(item) = self.#label {
let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event);
let content = format!("{}", item);
let data_event = XmlEvent::characters(&content);
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) {
@@ -202,6 +282,19 @@ pub fn serialize(
let _ret = writer.write(end_event);
}
}),
Some(&FieldType::FieldTypeOption { .. }) => Some(quote!{
for item in &self.#label {
if let Some(value) = item {
writer.set_skip_start_end(false);
match value.serialize(writer) {
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
}
}
}),
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote!{
for item in &self.#label {
writer.set_skip_start_end(false);
@@ -241,7 +334,8 @@ pub fn serialize(
error!("Struct: start to expand {:?}", #root);
let skip = writer.skip_start_end();
if !skip {
let struct_start_event = XmlEvent::start_element(#root)#build_attributes#add_namespaces;
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
#build_attributes
let _ret = writer.write(struct_start_event);
}