diff --git a/yaserde/tests/ser_enum.rs b/yaserde/tests/ser_enum.rs new file mode 100644 index 0000000..3515f43 --- /dev/null +++ b/yaserde/tests/ser_enum.rs @@ -0,0 +1,285 @@ +#[macro_use] +extern crate yaserde_derive; + +use std::io::Write; +use yaserde::ser::to_string; +use yaserde::YaSerialize; + +macro_rules! convert_and_validate { + ($model: expr, $content: expr) => { + let data: Result = to_string(&$model); + assert_eq!( + data, + Ok( + String::from($content) + .split("\n") + .map(|s| s.trim()) + .collect::() + ) + ); + }; +} + +#[test] +fn ser_enum() { + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + color: Color, + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "color")] + pub enum Color { + White, + Black, + #[yaserde(rename = "custom")] + Custom { + enabled: String, + u8_value: u8, + i8_value: i8, + u16_value: u16, + i16_value: i16, + u32_value: u32, + i32_value: i32, + u64_value: u64, + i64_value: i64, + f32_value: f32, + f64_value: f64, + color: RGBColor, + alpha: Alpha, + alphas: Vec, + }, + } + + impl Default for Color { + fn default() -> Color { + Color::White + } + } + + assert_eq!(Color::default(), Color::White); + + #[derive(YaSerialize, PartialEq, Debug)] + pub struct RGBColor { + red: String, + green: String, + blue: String, + } + + #[derive(YaSerialize, PartialEq, Debug)] + pub enum Alpha { + Transparent, + Opaque, + } + + let model = XmlStruct { + color: Color::Black, + }; + + let content = r#"Black"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Color::Custom { + enabled: "true".to_string(), + u8_value: 8, + i8_value: -8, + u16_value: 16, + i16_value: -16, + u32_value: 32, + i32_value: -32, + u64_value: 64, + i64_value: -64, + f32_value: 32.0, + f64_value: 64.0, + color: RGBColor { + red: "0".to_string(), + green: "128".to_string(), + blue: "255".to_string(), + }, + alpha: Alpha::Opaque, + alphas: vec![Alpha::Opaque, Alpha::Transparent], + }, + }; + + let content = r#" + +true +8 +-8 +16 +-16 +32 +-32 +64 +-64 +32 +64 +0128255 +Opaque +Opaque +Transparent + +"#; + + convert_and_validate!(model, content); +} + +#[test] +fn ser_attribute_enum() { + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + #[yaserde(attribute)] + color: Color, + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "color")] + pub enum Color { + #[yaserde(rename = "pink")] + Pink, + } + + let model = XmlStruct { color: Color::Pink }; + + let content = r#""#; + convert_and_validate!(model, content); +} + +#[test] +fn ser_unnamed_enum() { + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + color: Enum, + } + + #[derive(YaSerialize, PartialEq, Debug, Default)] + pub struct OtherStruct { + fi: i32, + se: i32, + } + + #[derive(YaSerialize, PartialEq, Debug)] + pub enum Enum { + Simple, + Field(String), + FullPath(std::string::String), + Integer(i32), + UserStruct(OtherStruct), + OptionString(Option), + OptionUserStruct(Option), + Strings(Vec), + Ints(Vec), + Structs(Vec), + #[yaserde(rename = "renamed")] + ToRename(u32), + #[yaserde(rename = "renamed.with.dots")] + ToRenameDots(u32), + } + + impl Default for Enum { + fn default() -> Enum { + Enum::Simple + } + } + + let model = XmlStruct { + color: Enum::Field(String::from("some_text")), + }; + + let content = r#"some_text"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::FullPath(String::from("some_text")), + }; + + let content = r#"some_text"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::Integer(56), + }; + + let content = + r#"56"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::UserStruct(OtherStruct { fi: 24, se: 42 }), + }; + + let content = r#"2442"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::OptionString(Some(String::from("some_text"))), + }; + + let content = r#"some_text"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::OptionString(None), + }; + + let content = r#""#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::OptionUserStruct(Some(OtherStruct { fi: 12, se: 23 })), + }; + + let content = r#"1223"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::OptionUserStruct(None), + }; + + let content = r#""#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::Strings(vec![String::from("abc"), String::from("def")]), + }; + + let content = r#"abcdef"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::Ints(vec![23, 45]), + }; + + let content = r#"2345"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::Structs(vec![ + OtherStruct { fi: 12, se: 23 }, + OtherStruct { fi: 34, se: 45 }, + ]), + }; + + let content = r#"12233445"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::ToRename(87), + }; + + let content = + r#"87"#; + convert_and_validate!(model, content); + + let model = XmlStruct { + color: Enum::ToRenameDots(84), + }; + + let content = + r#"84"#; + convert_and_validate!(model, content); +} diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index cd40425..0e1e8a1 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -277,231 +277,6 @@ fn ser_text_content_with_attributes() { convert_and_validate!(model, content); } -#[test] -fn ser_enum() { - #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(root = "base")] - pub struct XmlStruct { - color: Color, - } - - #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(root = "color")] - pub enum Color { - White, - Black, - #[yaserde(rename = "custom")] - Custom { - enabled: String, - color: RGBColor, - alpha: Alpha, - alphas: Vec, - }, - } - - impl Default for Color { - fn default() -> Color { - Color::White - } - } - - assert_eq!(Color::default(), Color::White); - - #[derive(YaSerialize, PartialEq, Debug)] - pub struct RGBColor { - red: String, - green: String, - blue: String, - } - - #[derive(YaSerialize, PartialEq, Debug)] - pub enum Alpha { - Transparent, - Opaque, - } - - let model = XmlStruct { - color: Color::Black, - }; - - let content = "Black"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Color::Custom { - enabled: "true".to_string(), - color: RGBColor { - red: "0".to_string(), - green: "128".to_string(), - blue: "255".to_string(), - }, - alpha: Alpha::Opaque, - alphas: vec![Alpha::Opaque, Alpha::Transparent], - }, - }; - - let content = "true0128255OpaqueOpaqueTransparent"; - convert_and_validate!(model, content); -} - -#[test] -fn ser_attribute_enum() { - #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(root = "base")] - pub struct XmlStruct { - #[yaserde(attribute)] - color: Color, - } - - #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(root = "color")] - pub enum Color { - #[yaserde(rename = "pink")] - Pink, - } - - let model = XmlStruct { color: Color::Pink }; - - let content = ""; - convert_and_validate!(model, content); -} - -#[test] -fn ser_unnamed_enum() { - #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(root = "base")] - pub struct XmlStruct { - color: Enum, - } - - #[derive(YaSerialize, PartialEq, Debug, Default)] - pub struct OtherStruct { - fi: i32, - se: i32, - } - - #[derive(YaSerialize, PartialEq, Debug)] - pub enum Enum { - Simple, - Field(String), - FullPath(std::string::String), - Integer(i32), - UserStruct(OtherStruct), - OptionString(Option), - OptionUserStruct(Option), - Strings(Vec), - Ints(Vec), - Structs(Vec), - #[yaserde(rename = "renamed")] - ToRename(u32), - #[yaserde(rename = "renamed.with.dots")] - ToRenameDots(u32), - } - - impl Default for Enum { - fn default() -> Enum { - Enum::Simple - } - } - - let model = XmlStruct { - color: Enum::Field(String::from("some_text")), - }; - - let content = "some_text"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::FullPath(String::from("some_text")), - }; - - let content = "some_text"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::Integer(56), - }; - - let content = - "56"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::UserStruct(OtherStruct { fi: 24, se: 42 }), - }; - - let content = "2442"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::OptionString(Some(String::from("some_text"))), - }; - - let content = "some_text"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::OptionString(None), - }; - - let content = ""; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::OptionUserStruct(Some(OtherStruct { fi: 12, se: 23 })), - }; - - let content = "1223"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::OptionUserStruct(None), - }; - - let content = ""; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::Strings(vec![String::from("abc"), String::from("def")]), - }; - - let content = "abcdef"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::Ints(vec![23, 45]), - }; - - let content = "2345"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::Structs(vec![ - OtherStruct { fi: 12, se: 23 }, - OtherStruct { fi: 34, se: 45 }, - ]), - }; - - let content = "12233445"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::ToRename(87), - }; - - let content = - "87"; - convert_and_validate!(model, content); - - let model = XmlStruct { - color: Enum::ToRenameDots(84), - }; - - let content = - "84"; - convert_and_validate!(model, content); -} - #[test] fn ser_name_issue_21() { #[derive(YaSerialize, PartialEq, Debug)] diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index f1902be..2a63988 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -61,14 +61,26 @@ pub fn serialize( let field_label_name = renamed_field_label.unwrap().to_string(); match get_field_type(field) { - Some(FieldType::FieldTypeString) => Some({ + Some(FieldType::FieldTypeString) + | Some(FieldType::FieldTypeBool) + | Some(FieldType::FieldTypeU8) + | Some(FieldType::FieldTypeI8) + | Some(FieldType::FieldTypeU16) + | Some(FieldType::FieldTypeI16) + | Some(FieldType::FieldTypeU32) + | Some(FieldType::FieldTypeI32) + | Some(FieldType::FieldTypeF32) + | Some(FieldType::FieldTypeU64) + | Some(FieldType::FieldTypeI64) + | Some(FieldType::FieldTypeF64) => Some({ quote! { match self { &#name::#label{ref #field_label, ..} => { let struct_start_event = XmlEvent::start_element(#field_label_name); writer.write(struct_start_event).map_err(|e| e.to_string())?; - let data_event = XmlEvent::characters(#field_label); + let string_value = #field_label.to_string(); + let data_event = XmlEvent::characters(&string_value); writer.write(data_event).map_err(|e| e.to_string())?; let struct_end_event = XmlEvent::end_element();