support Option type value
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user