From 5158f9ae3404700f5fa49e691918bf55168c5329 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Mon, 15 Jul 2019 20:59:38 +0200 Subject: [PATCH 1/9] add rust versions --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1b7784f..415a125 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,11 @@ rust: - 1.28.0 - 1.29.0 - 1.31.0 + - 1.32.0 + - 1.33.0 + - 1.34.0 + - 1.35.0 + - 1.36.0 - stable - beta - nightly From 0566b6e77387df8f29827a089327f06afa02366f Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Mon, 15 Jul 2019 21:21:19 +0200 Subject: [PATCH 2/9] remove rust 1.29, incompatible with missing edition version --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 415a125..da45a54 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ rust: - 1.26.0 - 1.27.0 - 1.28.0 - - 1.29.0 - 1.31.0 - 1.32.0 - 1.33.0 From e11deedccb03e63b62cdf372a6a9c8474cf89852 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 08:09:46 +0200 Subject: [PATCH 3/9] update rust versions --- .travis.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index da45a54..c76a02c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,5 @@ language: rust rust: - - 1.26.0 - - 1.27.0 - - 1.28.0 - - 1.31.0 - - 1.32.0 - - 1.33.0 - - 1.34.0 - - 1.35.0 - 1.36.0 - stable - beta From 779bddf40ad24b0f6cc3f91577ea6927be92eeb2 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 08:10:18 +0200 Subject: [PATCH 4/9] be able to contructor a serializer with output configuration --- yaserde/src/ser/mod.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 2938552..4d96732 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -12,6 +12,13 @@ pub fn to_string(model: &T) -> Result { Ok(String::from(data)) } +pub fn to_string_with_config(model: &T, config: &Config) -> Result { + let buf = Cursor::new(Vec::new()); + let cursor = serialize_with_writer(model, buf)?; + let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); + Ok(String::from(data)) +} + pub fn serialize_with_writer(model: &T, writer: W) -> Result { let mut serializer = Serializer::new_from_writer(writer); match model.serialize(&mut serializer) { @@ -93,3 +100,9 @@ impl<'de, W: Write> Serializer { self.writer.write(event) } } + +pub struct Config { + perform_indent: bool, + write_document_declaration: bool, + indent_string: Option +} From 64122a9e64da90a4fea93b521848f4322dd4c802 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 08:29:55 +0200 Subject: [PATCH 5/9] update check tools --- .travis.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7b76c40..99996bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,36 +9,33 @@ rust: matrix: allow_failures: - rust: nightly + include: # Rustfmt - - env: RUSTFMT_VERSION="0.99.5" - rust: nightly-2018-09-26 + - rust: stable install: - rustup component add rustfmt-preview - - cargo install rustfmt-nightly --force --version $RUSTFMT_VERSION || echo "rustfmt already installed" before_script: - - cargo-fmt fmt -- --version + - cargo fmt --version script: - - cargo fmt + - cargo fmt -- --check # Clippy - - env: CLIPPY_VERSION="0.0.212" - rust: nightly + - rust: stable install: - - travis_wait cargo install clippy --version $CLIPPY_VERSION || echo "clippy already installed" + - rustup component add clippy-preview script: # Fail if clippy output contains "error:" or "warning:" - cargo clippy 2>&1 | tee ./clippy.out && ! grep -qe "error:\|warning:" ./clippy.out # Test coverage (with Tarpaulin) - - env: TARPAULIN_VERSION="0.6.10" - rust: stable + - rust: stable # To avoid "Error: EPERM: operation not permitted" error (see https://github.com/valery-barysok/session-file-store/issues/58) sudo: true install: - - curl -sL https://github.com/xd009642/tarpaulin/releases/download/$TARPAULIN_VERSION/cargo-tarpaulin-$TARPAULIN_VERSION-travis.tar.gz | tar xvz -C $HOME/.cargo/bin + - RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin --force script: - - cargo tarpaulin --ciserver travis-ci --coveralls $TRAVIS_JOB_ID + - cargo tarpaulin -v --ciserver travis-ci --coveralls $TRAVIS_JOB_ID script: - cargo test From dd5ca6df6b51b7d43d2bec524e9a73d12803955f Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 09:04:00 +0200 Subject: [PATCH 6/9] update dependencies with 1.0 releases --- yaserde/src/ser/mod.rs | 2 +- yaserde_derive/Cargo.toml | 6 +++--- yaserde_derive/src/attribute.rs | 4 ++-- yaserde_derive/src/field_type.rs | 7 +++---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 4d96732..8b2642b 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -12,7 +12,7 @@ pub fn to_string(model: &T) -> Result { Ok(String::from(data)) } -pub fn to_string_with_config(model: &T, config: &Config) -> Result { +pub fn to_string_with_config(model: &T, _config: &Config) -> Result { let buf = Cursor::new(Vec::new()); let cursor = serialize_with_writer(model, buf)?; let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); diff --git a/yaserde_derive/Cargo.toml b/yaserde_derive/Cargo.toml index 67674d7..e61390f 100644 --- a/yaserde_derive/Cargo.toml +++ b/yaserde_derive/Cargo.toml @@ -11,9 +11,9 @@ documentation = "https://docs.rs/yaserde" readme = "../README.md" [dependencies] -syn = { version = "0.15.22", features = ["visit", "extra-traits"] } -proc-macro2 = "0.4.24" -quote = "0.6.10" +syn = { version = "1.0.5", features = ["visit", "extra-traits"] } +proc-macro2 = "1.0.5" +quote = "1.0.2" [lib] name = "yaserde_derive" diff --git a/yaserde_derive/src/attribute.rs b/yaserde_derive/src/attribute.rs index cb394de..71f1c7f 100644 --- a/yaserde_derive/src/attribute.rs +++ b/yaserde_derive/src/attribute.rs @@ -40,7 +40,7 @@ impl YaSerdeAttribute { let mut text = false; for attr in attrs.iter() { - let mut attr_iter = attr.clone().tts.into_iter(); + let mut attr_iter = attr.clone().tokens.into_iter(); if let Some(token) = attr_iter.next() { if let TokenTree::Group(group) = token { if group.delimiter() == Delimiter::Parenthesis { @@ -146,7 +146,7 @@ fn parse_attributes() { leading_colon: None, segments: punctuated, }, - tts: TokenStream::from_str("(attribute)").unwrap(), + tokens: TokenStream::from_str("(attribute)").unwrap(), }]; let attrs = YaSerdeAttribute::parse(&attributes); diff --git a/yaserde_derive/src/field_type.rs b/yaserde_derive/src/field_type.rs index ad8f9a3..f567a98 100644 --- a/yaserde_derive/src/field_type.rs +++ b/yaserde_derive/src/field_type.rs @@ -1,5 +1,4 @@ use syn; -use syn::punctuated::Pair; use syn::Type::Path; #[derive(Debug)] @@ -56,7 +55,7 @@ pub fn get_field_type(field: &syn::Field) -> Option { return None; } match path.path.segments.first() { - Some(Pair::End(t)) => FieldType::from_ident(t), + Some(path_segment) => FieldType::from_ident(path_segment), _ => None, } } @@ -66,10 +65,10 @@ pub fn get_field_type(field: &syn::Field) -> Option { fn get_sub_type(t: &syn::PathSegment) -> Option { if let syn::PathArguments::AngleBracketed(ref args) = t.arguments { - if let Some(Pair::End(tt)) = args.args.first() { + if let Some(tt) = args.args.first() { if let syn::GenericArgument::Type(ref argument) = *tt { if let Path(ref path2) = *argument { - if let Some(Pair::End(ttt)) = path2.path.segments.first() { + if let Some(ttt) = path2.path.segments.first() { return Some(ttt.clone()); } } From 29e6736d8d188f1046d43cc3795ba2c1c30b8797 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 09:04:29 +0200 Subject: [PATCH 7/9] format code --- yaserde/src/ser/mod.rs | 7 +- yaserde/tests/der_namespace.rs | 7 +- yaserde/tests/se_default.rs | 13 +- yaserde_derive/src/de/build_default_value.rs | 1 - yaserde_derive/src/de/expand_enum.rs | 200 ++++++++++++------- yaserde_derive/src/de/expand_struct.rs | 4 +- yaserde_derive/src/de/mod.rs | 11 +- yaserde_derive/src/ser/element.rs | 19 +- yaserde_derive/src/ser/expand_struct.rs | 23 ++- yaserde_derive/src/ser/mod.rs | 1 - 10 files changed, 172 insertions(+), 114 deletions(-) diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 8b2642b..76a6994 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -12,7 +12,10 @@ pub fn to_string(model: &T) -> Result { Ok(String::from(data)) } -pub fn to_string_with_config(model: &T, _config: &Config) -> Result { +pub fn to_string_with_config( + model: &T, + _config: &Config, +) -> Result { let buf = Cursor::new(Vec::new()); let cursor = serialize_with_writer(model, buf)?; let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); @@ -104,5 +107,5 @@ impl<'de, W: Write> Serializer { pub struct Config { perform_indent: bool, write_document_declaration: bool, - indent_string: Option + indent_string: Option, } diff --git a/yaserde/tests/der_namespace.rs b/yaserde/tests/der_namespace.rs index c99d8df..dabf6e5 100644 --- a/yaserde/tests/der_namespace.rs +++ b/yaserde/tests/der_namespace.rs @@ -23,7 +23,7 @@ fn de_struct_namespace() { root = "book", prefix = "ns", namespace = "ns: http://www.sample.com/ns/domain", - namespace = "ns2: http://www.sample.com/ns/domain_2", + namespace = "ns2: http://www.sample.com/ns/domain_2" )] pub struct Book { #[yaserde(prefix = "ns")] @@ -83,7 +83,10 @@ fn de_struct_namespace() { Little prince "#; let loaded: Result = from_str(content); - assert_eq!(loaded, Err("bad namespace for book, found http://www.sample.com/ns/domain2".to_string())); + assert_eq!( + loaded, + Err("bad namespace for book, found http://www.sample.com/ns/domain2".to_string()) + ); } #[test] diff --git a/yaserde/tests/se_default.rs b/yaserde/tests/se_default.rs index 5a1e690..21fcd7e 100644 --- a/yaserde/tests/se_default.rs +++ b/yaserde/tests/se_default.rs @@ -36,7 +36,8 @@ fn se_default_field_string() { }, content ); - let content = "my_value"; + let content = + "my_value"; convert_and_validate!( XmlStruct { background: "my_value".to_string(), @@ -61,13 +62,9 @@ fn se_default_field_boolean() { let content = ""; convert_and_validate!(XmlStruct { background: true }, content); - let content = "false"; - convert_and_validate!( - XmlStruct { - background: false, - }, - content - ); + let content = + "false"; + convert_and_validate!(XmlStruct { background: false }, content); } #[test] diff --git a/yaserde_derive/src/de/build_default_value.rs b/yaserde_derive/src/de/build_default_value.rs index 5ee953a..19843cc 100644 --- a/yaserde_derive/src/de/build_default_value.rs +++ b/yaserde_derive/src/de/build_default_value.rs @@ -1,4 +1,3 @@ - use proc_macro2::{Span, TokenStream}; use syn::Ident; diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index 8779d1f..e983118 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -1,4 +1,5 @@ use attribute::*; +use de::build_default_value::build_default_value; use field_type::*; use proc_macro2::{Span, TokenStream}; use quote::TokenStreamExt; @@ -6,7 +7,6 @@ use std::collections::BTreeMap; use syn::DataEnum; use syn::Fields; use syn::Ident; -use de::build_default_value::build_default_value; pub fn parse( data_enum: &DataEnum, @@ -28,42 +28,72 @@ pub fn parse( let field_attrs = YaSerdeAttribute::parse(&field.attrs); match get_field_type(field) { - Some(FieldType::FieldTypeString) => { - build_default_value(field_label, "e! {String}, "e! {"".to_string()}, &field_attrs.default) - } - Some(FieldType::FieldTypeBool) => { - build_default_value(field_label, "e! {bool}, "e! {false}, &field_attrs.default) - } + Some(FieldType::FieldTypeString) => build_default_value( + field_label, + "e! {String}, + "e! {"".to_string()}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeBool) => build_default_value( + field_label, + "e! {bool}, + "e! {false}, + &field_attrs.default, + ), Some(FieldType::FieldTypeI8) => { build_default_value(field_label, "e! {i8}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeU8) => { build_default_value(field_label, "e! {u8}, "e! {0}, &field_attrs.default) } - Some(FieldType::FieldTypeI16) => { - build_default_value(field_label, "e! {i16}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeU16) => { - build_default_value(field_label, "e! {u16}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeI32) => { - build_default_value(field_label, "e! {i32}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeU32) => { - build_default_value(field_label, "e! {u32}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeI64) => { - build_default_value(field_label, "e! {i64}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeU64) => { - build_default_value(field_label, "e! {u64}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeF32) => { - build_default_value(field_label, "e! {f32}, "e! {0}, &field_attrs.default) - } - Some(FieldType::FieldTypeF64) => { - build_default_value(field_label, "e! {f64}, "e! {0}, &field_attrs.default) - } + Some(FieldType::FieldTypeI16) => build_default_value( + field_label, + "e! {i16}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeU16) => build_default_value( + field_label, + "e! {u16}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeI32) => build_default_value( + field_label, + "e! {i32}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeU32) => build_default_value( + field_label, + "e! {u32}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeI64) => build_default_value( + field_label, + "e! {i64}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeU64) => build_default_value( + field_label, + "e! {u64}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeF32) => build_default_value( + field_label, + "e! {f32}, + "e! {0}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeF64) => build_default_value( + field_label, + "e! {f64}, + "e! {0}, + &field_attrs.default, + ), Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value( field_label, "e! {#struct_name}, @@ -88,42 +118,78 @@ pub fn parse( Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeBool) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI8) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU8) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI16) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU16) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI32) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU32) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI64) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU64) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeF32) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeF64) => { - build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) - } + Some(&FieldType::FieldTypeString) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeBool) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI8) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU8) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI16) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU16) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI32) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU32) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI64) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU64) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeF32) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeF64) => build_default_value( + field_label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), Some(&FieldType::FieldTypeStruct { ref struct_name }) => build_default_value( field_label, "e! {Vec<#struct_name>}, diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index a07f124..4c61faf 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -1,11 +1,11 @@ use attribute::*; +use de::build_default_value::build_default_value; use field_type::*; use proc_macro2::{Span, TokenStream}; use quote::TokenStreamExt; use std::collections::BTreeMap; use syn::DataStruct; use syn::Ident; -use de::build_default_value::build_default_value; pub fn parse( data_struct: &DataStruct, @@ -14,7 +14,6 @@ pub fn parse( prefix: &Option, namespaces: &BTreeMap, ) -> TokenStream { - let namespaces_matches: TokenStream = namespaces .iter() .map(|(p, ns)| { @@ -1361,7 +1360,6 @@ fn build_call_visitor( prefix: &Option, namespaces: &BTreeMap, ) -> Option { - let namespaces_matches: TokenStream = namespaces .iter() .map(|(p, ns)| { diff --git a/yaserde_derive/src/de/mod.rs b/yaserde_derive/src/de/mod.rs index 02d9d93..617df1f 100644 --- a/yaserde_derive/src/de/mod.rs +++ b/yaserde_derive/src/de/mod.rs @@ -1,4 +1,3 @@ - pub mod build_default_value; pub mod expand_enum; pub mod expand_struct; @@ -17,9 +16,13 @@ pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result { - expand_struct::parse(data_struct, name, &root, &root_attrs.prefix, &root_attrs.namespaces) - } + syn::Data::Struct(ref data_struct) => expand_struct::parse( + data_struct, + name, + &root, + &root_attrs.prefix, + &root_attrs.namespaces, + ), syn::Data::Enum(ref data_enum) => { expand_enum::parse(data_enum, name, &root, &root_attrs.namespaces) } diff --git a/yaserde_derive/src/ser/element.rs b/yaserde_derive/src/ser/element.rs index 41a0abc..aa53b94 100644 --- a/yaserde_derive/src/ser/element.rs +++ b/yaserde_derive/src/ser/element.rs @@ -1,11 +1,6 @@ - use proc_macro2::{Ident, Span, TokenStream}; - -pub fn enclose_formatted_characters( - label: &Ident, - label_name: String - ) -> TokenStream { +pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); @@ -19,10 +14,7 @@ pub fn enclose_formatted_characters( } } -pub fn enclose_formatted_characters_for_value( - label: &Ident, - label_name: String - ) -> TokenStream { +pub fn enclose_formatted_characters_for_value(label: &Ident, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); @@ -36,10 +28,7 @@ pub fn enclose_formatted_characters_for_value( } } -pub fn enclose_characters( - label: &Option, - label_name: String - ) -> TokenStream { +pub fn enclose_characters(label: &Option, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); @@ -57,7 +46,7 @@ pub fn serialize_element( label: &Option, label_name: String, default: &Option, - ) -> Option { +) -> Option { let inner = enclose_characters(label, label_name); if let Some(ref d) = default { diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index a4dd1a1..36f3320 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -79,7 +79,7 @@ pub fn serialize( }); }) } - }, + } Some(FieldType::FieldTypeOption { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { @@ -108,7 +108,7 @@ pub fn serialize( }; }) } - }, + } Some(&FieldType::FieldTypeBool) | Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeU8) @@ -160,7 +160,7 @@ pub fn serialize( }; }) } - }, + } Some(&FieldType::FieldTypeVec { .. }) => { let item_ident = Ident::new("yas_item", Span::call_site()); let inner = enclose_formatted_characters(&item_ident, label_name); @@ -184,7 +184,7 @@ pub fn serialize( } }) } - }, + } _ => unimplemented!(), } } @@ -228,7 +228,7 @@ pub fn serialize( }); }) } - }, + } _ => None, } }) @@ -293,8 +293,9 @@ pub fn serialize( | Some(FieldType::FieldTypeI64) | Some(FieldType::FieldTypeU64) | Some(FieldType::FieldTypeF32) - | Some(FieldType::FieldTypeF64) => - serialize_element(label, label_name, &field_attrs.default), + | Some(FieldType::FieldTypeF64) => { + serialize_element(label, label_name, &field_attrs.default) + } Some(FieldType::FieldTypeOption { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { @@ -330,7 +331,7 @@ pub fn serialize( } }) } - }, + } Some(&FieldType::FieldTypeVec { .. }) => { let item_ident = Ident::new("yas_item", Span::call_site()); let inner = enclose_formatted_characters_for_value(&item_ident, label_name); @@ -356,7 +357,7 @@ pub fn serialize( } }) } - }, + } Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { if let Some(ref item) = &self.#label { writer.set_start_event_name(Some(#label_name.to_string())); @@ -416,7 +417,7 @@ pub fn serialize( #inner } }) - }, + } Some(&FieldType::FieldTypeBool) | Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeU8) @@ -436,7 +437,7 @@ pub fn serialize( #inner } }) - }, + } Some(&FieldType::FieldTypeOption { .. }) => Some(quote! { for item in &self.#label { if let Some(value) = item { diff --git a/yaserde_derive/src/ser/mod.rs b/yaserde_derive/src/ser/mod.rs index 1dfbde0..edeabfe 100644 --- a/yaserde_derive/src/ser/mod.rs +++ b/yaserde_derive/src/ser/mod.rs @@ -1,4 +1,3 @@ - pub mod element; pub mod expand_enum; pub mod expand_struct; From 943abf4296aa019862e3b3ae53ab88e05b139db8 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 09:53:08 +0200 Subject: [PATCH 8/9] update config --- yaserde/src/ser/mod.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 76a6994..0344906 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -7,22 +7,22 @@ use YaSerialize; pub fn to_string(model: &T) -> Result { let buf = Cursor::new(Vec::new()); - let cursor = serialize_with_writer(model, buf)?; + let cursor = serialize_with_writer(model, buf, &Config::default())?; let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); Ok(String::from(data)) } pub fn to_string_with_config( model: &T, - _config: &Config, + config: &Config, ) -> Result { let buf = Cursor::new(Vec::new()); - let cursor = serialize_with_writer(model, buf)?; + let cursor = serialize_with_writer(model, buf, config)?; let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); Ok(String::from(data)) } -pub fn serialize_with_writer(model: &T, writer: W) -> Result { +pub fn serialize_with_writer(model: &T, writer: W, _config: &Config) -> Result { let mut serializer = Serializer::new_from_writer(writer); match model.serialize(&mut serializer) { Ok(()) => Ok(serializer.into_inner()), @@ -105,7 +105,17 @@ impl<'de, W: Write> Serializer { } pub struct Config { - perform_indent: bool, - write_document_declaration: bool, - indent_string: Option, + pub perform_indent: bool, + pub write_document_declaration: bool, + pub indent_string: Option, +} + +impl Default for Config { + fn default() -> Self { + Config{ + perform_indent: false, + write_document_declaration: true, + indent_string: None + } + } } From 2b701262ac3e4d083abb9b5af719c1b865991fd1 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 8 Oct 2019 10:19:50 +0200 Subject: [PATCH 9/9] fix clippy feedbacks and format code --- yaserde/src/ser/mod.rs | 15 +-- yaserde_derive/src/de/expand_struct.rs | 164 ++++++++----------------- 2 files changed, 57 insertions(+), 122 deletions(-) diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 0344906..6886d9a 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -12,17 +12,18 @@ pub fn to_string(model: &T) -> Result { Ok(String::from(data)) } -pub fn to_string_with_config( - model: &T, - config: &Config, -) -> Result { +pub fn to_string_with_config(model: &T, config: &Config) -> Result { let buf = Cursor::new(Vec::new()); let cursor = serialize_with_writer(model, buf, config)?; let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8"); Ok(String::from(data)) } -pub fn serialize_with_writer(model: &T, writer: W, _config: &Config) -> Result { +pub fn serialize_with_writer( + model: &T, + writer: W, + _config: &Config, +) -> Result { let mut serializer = Serializer::new_from_writer(writer); match model.serialize(&mut serializer) { Ok(()) => Ok(serializer.into_inner()), @@ -112,10 +113,10 @@ pub struct Config { impl Default for Config { fn default() -> Self { - Config{ + Config { perform_indent: false, write_document_declaration: true, - indent_string: None + indent_string: None, } } } diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 4c61faf..22debe1 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -396,14 +396,12 @@ pub fn parse( return None; } - let label_name = if let Some(value) = field_attrs.rename { + let label_name = if let Some(ref value) = field_attrs.rename { Ident::new(&value.to_string(), Span::call_site()).to_string() } else { field.ident.clone().unwrap().to_string() }; - let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); - match get_field_type(field) { Some(FieldType::FieldTypeString) => { let visitor = Ident::new("visit_str", Span::call_site()); @@ -411,10 +409,8 @@ pub fn parse( "e! {String}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -424,10 +420,8 @@ pub fn parse( "e! {bool}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -437,10 +431,8 @@ pub fn parse( "e! {i8}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -450,10 +442,8 @@ pub fn parse( "e! {u8}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -463,10 +453,8 @@ pub fn parse( "e! {u16}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -476,10 +464,8 @@ pub fn parse( "e! {i16}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -489,10 +475,8 @@ pub fn parse( "e! {u32}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -502,10 +486,8 @@ pub fn parse( "e! {i32}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -515,10 +497,8 @@ pub fn parse( "e! {u64}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -528,10 +508,8 @@ pub fn parse( "e! {i64}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -541,10 +519,8 @@ pub fn parse( "e! {f32}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -554,10 +530,8 @@ pub fn parse( "e! {f64}, &visitor, "e! {= value}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -584,10 +558,8 @@ pub fn parse( "e! {String}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -597,10 +569,8 @@ pub fn parse( "e! {bool}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -610,10 +580,8 @@ pub fn parse( "e! {u8}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -623,10 +591,8 @@ pub fn parse( "e! {i8}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -636,10 +602,8 @@ pub fn parse( "e! {u16}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -649,10 +613,8 @@ pub fn parse( "e! {i16}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -662,10 +624,8 @@ pub fn parse( "e! {u32}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -675,10 +635,8 @@ pub fn parse( "e! {i32}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -688,10 +646,8 @@ pub fn parse( "e! {u64}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -701,10 +657,8 @@ pub fn parse( "e! {i64}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -714,10 +668,8 @@ pub fn parse( "e! {f32}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -727,10 +679,8 @@ pub fn parse( "e! {f64}, &visitor, "e! {= Some(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -763,10 +713,8 @@ pub fn parse( "e! {String}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -776,10 +724,8 @@ pub fn parse( "e! {bool}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -789,10 +735,8 @@ pub fn parse( "e! {i8}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -802,10 +746,8 @@ pub fn parse( "e! {u8}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -815,10 +757,8 @@ pub fn parse( "e! {i16}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -828,10 +768,8 @@ pub fn parse( "e! {u16}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -841,10 +779,8 @@ pub fn parse( "e! {i32}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -854,10 +790,8 @@ pub fn parse( "e! {u32}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -867,10 +801,8 @@ pub fn parse( "e! {i64}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -880,10 +812,8 @@ pub fn parse( "e! {u64}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -893,10 +823,8 @@ pub fn parse( "e! {f32}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -906,10 +834,8 @@ pub fn parse( "e! {f64}, &visitor, "e! {.push(value)}, - &visitor_label, + &field_attrs, label, - &label_name, - &field_attrs.prefix, &namespaces, ) } @@ -1354,17 +1280,25 @@ fn build_call_visitor( field_type: &TokenStream, visitor: &Ident, action: &TokenStream, - visitor_label: &Ident, + field_attrs: &YaSerdeAttribute, label: &Option, - label_name: &str, - prefix: &Option, namespaces: &BTreeMap, ) -> Option { + let prefix = field_attrs.prefix.clone(); + + // let label = &field.ident; + let label_name = if let Some(ref value) = field_attrs.rename { + Ident::new(&value.to_string(), Span::call_site()).to_string() + } else { + label.clone().unwrap().to_string() + }; + let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); + let namespaces_matches: TokenStream = namespaces .iter() .map(|(p, ns)| { let str_ns = ns.as_str(); - if *prefix == Some(p.to_string()) { + if prefix == Some(p.to_string()) { Some(quote!(#str_ns => {})) } else { None