Make custom serializer be called only once (#25)
This commit is contained in:
parent
4b5a28f80e
commit
7d8923a785
@ -77,35 +77,22 @@ pub fn serialize(
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
||||||
let struct_start_event = XmlEvent::start_element(#field_label_name);
|
|
||||||
let _ret = writer.write(struct_start_event);
|
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
&#name::#label{ref #field_label, ..} => {
|
&#name::#label{ref #field_label, ..} => {
|
||||||
writer.set_skip_start_end(true);
|
writer.set_start_event_name(Some(#field_label_name.to_string()));
|
||||||
if let Err(msg) = #field_label.serialize(writer) {
|
writer.set_skip_start_end(false);
|
||||||
return Err(msg);
|
#field_label.serialize(writer)?;
|
||||||
};
|
|
||||||
},
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
let struct_end_event = XmlEvent::end_element();
|
|
||||||
let _ret = writer.write(struct_end_event);
|
|
||||||
}),
|
}),
|
||||||
Some(FieldType::FieldTypeVec { .. }) => Some(quote! {
|
Some(FieldType::FieldTypeVec { .. }) => Some(quote! {
|
||||||
match self {
|
match self {
|
||||||
&#name::#label{ref #field_label, ..} => {
|
&#name::#label{ref #field_label, ..} => {
|
||||||
for item in #field_label {
|
for item in #field_label {
|
||||||
let struct_start_event = XmlEvent::start_element(#field_label_name);
|
writer.set_start_event_name(Some(#field_label_name.to_string()));
|
||||||
let _ret = writer.write(struct_start_event);
|
writer.set_skip_start_end(false);
|
||||||
|
item.serialize(writer)?;
|
||||||
writer.set_skip_start_end(true);
|
|
||||||
if let Err(msg) = item.serialize(writer) {
|
|
||||||
return Err(msg);
|
|
||||||
};
|
|
||||||
let struct_end_event = XmlEvent::end_element();
|
|
||||||
let _ret = writer.write(struct_end_event);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -163,10 +150,9 @@ pub fn serialize(
|
|||||||
});
|
});
|
||||||
|
|
||||||
let serialize = quote! {
|
let serialize = quote! {
|
||||||
|
writer.set_start_event_name(None);
|
||||||
writer.set_skip_start_end(true);
|
writer.set_skip_start_end(true);
|
||||||
if let Err(msg) = item.serialize(writer) {
|
item.serialize(writer)?;
|
||||||
return Err(msg);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let write_sub_type = |data_type| {
|
let write_sub_type = |data_type| {
|
||||||
@ -255,27 +241,27 @@ pub fn serialize(
|
|||||||
#[allow(unused_variables)]
|
#[allow(unused_variables)]
|
||||||
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
||||||
-> Result<(), String> {
|
-> Result<(), String> {
|
||||||
|
let skip = writer.skip_start_end();
|
||||||
|
|
||||||
|
if !skip {
|
||||||
if let Some(label) = writer.get_start_event_name() {
|
if let Some(label) = writer.get_start_event_name() {
|
||||||
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
||||||
let _ret = writer.write(struct_start_event);
|
let _ret = writer.write(struct_start_event);
|
||||||
return Ok(());
|
} else {
|
||||||
}
|
|
||||||
error!("Enum: start to expand {:?}", #root);
|
|
||||||
|
|
||||||
if !writer.skip_start_end() {
|
|
||||||
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
|
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
|
||||||
let _ret = writer.write(struct_start_event);
|
let _ret = writer.write(struct_start_event);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
#write_enum_content
|
#write_enum_content
|
||||||
}
|
}
|
||||||
|
|
||||||
if !writer.skip_start_end() {
|
if !skip {
|
||||||
let struct_end_event = XmlEvent::end_element();
|
let struct_end_event = XmlEvent::end_element();
|
||||||
let _ret = writer.write(struct_end_event);
|
let _ret = writer.write(struct_end_event);
|
||||||
}
|
}
|
||||||
writer.set_skip_start_end(false);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -361,24 +361,8 @@ pub fn serialize(
|
|||||||
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
||||||
if let Some(ref item) = &self.#label {
|
if let Some(ref item) = &self.#label {
|
||||||
writer.set_start_event_name(Some(#label_name.to_string()));
|
writer.set_start_event_name(Some(#label_name.to_string()));
|
||||||
match item.serialize(writer) {
|
writer.set_skip_start_end(false);
|
||||||
Ok(()) => {},
|
item.serialize(writer)?;
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
writer.set_start_event_name(None);
|
|
||||||
|
|
||||||
writer.set_skip_start_end(true);
|
|
||||||
match item.serialize(writer) {
|
|
||||||
Ok(()) => {},
|
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
let end_event = XmlEvent::end_element();
|
|
||||||
let _ret = writer.write(end_event);
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
@ -386,24 +370,8 @@ pub fn serialize(
|
|||||||
}
|
}
|
||||||
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
||||||
writer.set_start_event_name(Some(#label_name.to_string()));
|
writer.set_start_event_name(Some(#label_name.to_string()));
|
||||||
match self.#label.serialize(writer) {
|
writer.set_skip_start_end(false);
|
||||||
Ok(()) => {},
|
self.#label.serialize(writer)?;
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
writer.set_start_event_name(None);
|
|
||||||
|
|
||||||
writer.set_skip_start_end(true);
|
|
||||||
match self.#label.serialize(writer) {
|
|
||||||
Ok(()) => {},
|
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
let end_event = XmlEvent::end_element();
|
|
||||||
let _ret = writer.write(end_event);
|
|
||||||
}),
|
}),
|
||||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||||
let dt = Box::into_raw(data_type);
|
let dt = Box::into_raw(data_type);
|
||||||
@ -441,25 +409,17 @@ pub fn serialize(
|
|||||||
Some(&FieldType::FieldTypeOption { .. }) => Some(quote! {
|
Some(&FieldType::FieldTypeOption { .. }) => Some(quote! {
|
||||||
for item in &self.#label {
|
for item in &self.#label {
|
||||||
if let Some(value) = item {
|
if let Some(value) = item {
|
||||||
|
writer.set_start_event_name(None);
|
||||||
writer.set_skip_start_end(false);
|
writer.set_skip_start_end(false);
|
||||||
match value.serialize(writer) {
|
value.serialize(writer)?;
|
||||||
Ok(()) => {},
|
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
|
||||||
for item in &self.#label {
|
for item in &self.#label {
|
||||||
|
writer.set_start_event_name(None);
|
||||||
writer.set_skip_start_end(false);
|
writer.set_skip_start_end(false);
|
||||||
match item.serialize(writer) {
|
item.serialize(writer)?;
|
||||||
Ok(()) => {},
|
|
||||||
Err(msg) => {
|
|
||||||
return Err(msg);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Some(&FieldType::FieldTypeVec { .. }) => {
|
Some(&FieldType::FieldTypeVec { .. }) => {
|
||||||
@ -487,19 +447,19 @@ pub fn serialize(
|
|||||||
#[allow(unused_variables)]
|
#[allow(unused_variables)]
|
||||||
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
||||||
-> Result<(), String> {
|
-> Result<(), String> {
|
||||||
|
let skip = writer.skip_start_end();
|
||||||
|
|
||||||
|
if !skip {
|
||||||
if let Some(label) = writer.get_start_event_name() {
|
if let Some(label) = writer.get_start_event_name() {
|
||||||
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
||||||
#build_attributes
|
#build_attributes
|
||||||
let _ret = writer.write(struct_start_event);
|
let _ret = writer.write(struct_start_event);
|
||||||
return Ok(())
|
} else {
|
||||||
}
|
|
||||||
error!("Struct: start to expand {:?}", #root);
|
|
||||||
let skip = writer.skip_start_end();
|
|
||||||
if !skip {
|
|
||||||
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
|
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
|
||||||
#build_attributes
|
#build_attributes
|
||||||
let _ret = writer.write(struct_start_event);
|
let _ret = writer.write(struct_start_event);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#struct_inspector
|
#struct_inspector
|
||||||
|
|
||||||
@ -507,6 +467,7 @@ pub fn serialize(
|
|||||||
let struct_end_event = XmlEvent::end_element();
|
let struct_end_event = XmlEvent::end_element();
|
||||||
let _ret = writer.write(struct_end_event);
|
let _ret = writer.write(struct_end_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user