be able to use Option of struct and String
This commit is contained in:
@@ -234,7 +234,18 @@ pub fn parse(
|
||||
Some(&FieldType::FieldTypeF64) => {
|
||||
build_declare_visitor("e!{f64}, "e!{visit_f64}, &visitor_label)
|
||||
}
|
||||
_ => {
|
||||
Some(&FieldType::FieldTypeStruct{ref struct_name}) => {
|
||||
let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site());
|
||||
Some(quote!{
|
||||
#[allow(non_snake_case, non_camel_case_types)]
|
||||
struct #visitor_label;
|
||||
impl<'de> Visitor<'de> for #visitor_label {
|
||||
type Value = #struct_ident;
|
||||
}
|
||||
})
|
||||
}
|
||||
dude => {
|
||||
println!("{:?}", dude);
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
@@ -602,7 +613,24 @@ pub fn parse(
|
||||
&label_name,
|
||||
)
|
||||
}
|
||||
_ => None,
|
||||
Some(&FieldType::FieldTypeStruct { ref struct_name }) => {
|
||||
let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site());
|
||||
Some(quote!{
|
||||
#label_name => {
|
||||
reader.set_map_value();
|
||||
match #struct_ident::deserialize(reader) {
|
||||
Ok(parsed_item) => {
|
||||
#label = Some(parsed_item);
|
||||
let _root = reader.next_event();
|
||||
},
|
||||
Err(msg) => {
|
||||
return Err(msg);
|
||||
},
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeVec { data_type }) => {
|
||||
|
||||
@@ -123,13 +123,7 @@ pub fn serialize(
|
||||
|
||||
Some(quote!{
|
||||
&#name::#label{..} => {
|
||||
let struct_start_event = XmlEvent::start_element(#label_name);
|
||||
let _ret = writer.write(struct_start_event);
|
||||
|
||||
#enum_fields
|
||||
|
||||
let struct_end_event = XmlEvent::end_element();
|
||||
let _ret = writer.write(struct_end_event);
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -164,6 +158,11 @@ pub fn serialize(
|
||||
#[allow(unused_variables)]
|
||||
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
||||
-> Result<(), String> {
|
||||
if let Some(label) = writer.get_start_event_name() {
|
||||
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
||||
let _ret = writer.write(struct_start_event);
|
||||
return Ok(());
|
||||
}
|
||||
error!("Enum: start to expand {:?}", #root);
|
||||
|
||||
if !writer.skip_start_end() {
|
||||
|
||||
@@ -105,7 +105,7 @@ pub fn serialize(
|
||||
let _ret = writer.write(end_event);
|
||||
}
|
||||
}),
|
||||
_ => None,
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{
|
||||
@@ -170,7 +170,7 @@ pub fn serialize(
|
||||
};
|
||||
|
||||
let label_name = if let Some(prefix) = field_attrs.prefix {
|
||||
prefix + ":" + renamed_label.to_string().as_ref()
|
||||
format!("{}:{}", prefix, renamed_label)
|
||||
} else {
|
||||
renamed_label.to_string()
|
||||
};
|
||||
@@ -260,17 +260,46 @@ pub fn serialize(
|
||||
}
|
||||
}
|
||||
}),
|
||||
_ => None,
|
||||
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote!{
|
||||
if let Some(ref item) = &self.#label {
|
||||
let start_event = XmlEvent::start_element(#label_name);
|
||||
let _ret = writer.write(start_event);
|
||||
|
||||
writer.set_skip_start_end(false);
|
||||
match item.serialize(writer) {
|
||||
Ok(()) => {},
|
||||
Err(msg) => {
|
||||
return Err(msg);
|
||||
},
|
||||
};
|
||||
|
||||
let end_event = XmlEvent::end_element();
|
||||
let _ret = writer.write(end_event);
|
||||
}
|
||||
}),
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{
|
||||
writer.set_skip_start_end(false);
|
||||
writer.set_start_event_name(Some(#label_name.to_string()));
|
||||
match self.#label.serialize(writer) {
|
||||
Ok(()) => {},
|
||||
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 }) => {
|
||||
let dt = Box::into_raw(data_type);
|
||||
@@ -358,6 +387,12 @@ pub fn serialize(
|
||||
#[allow(unused_variables)]
|
||||
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
|
||||
-> Result<(), String> {
|
||||
if let Some(label) = writer.get_start_event_name() {
|
||||
let struct_start_event = XmlEvent::start_element(label.as_ref());
|
||||
#build_attributes
|
||||
let _ret = writer.write(struct_start_event);
|
||||
return Ok(())
|
||||
}
|
||||
error!("Struct: start to expand {:?}", #root);
|
||||
let skip = writer.skip_start_end();
|
||||
if !skip {
|
||||
|
||||
Reference in New Issue
Block a user