Merge pull request #23 from media-io/update_rust

Update rust
This commit is contained in:
Marc-Antoine ARNAUD 2019-10-08 12:14:21 +02:00 committed by GitHub
commit bb36546d2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 263 additions and 257 deletions

View File

@ -1,50 +1,41 @@
language: rust language: rust
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 - 1.36.0
- 1.37.0
- 1.38.0
- stable - stable
- beta - beta
- nightly - nightly
matrix: matrix:
allow_failures: allow_failures:
- rust: nightly - rust: nightly
include: include:
# Rustfmt # Rustfmt
- env: RUSTFMT_VERSION="0.99.5" - rust: stable
rust: nightly-2018-09-26
install: install:
- rustup component add rustfmt-preview - rustup component add rustfmt-preview
- cargo install rustfmt-nightly --force --version $RUSTFMT_VERSION || echo "rustfmt already installed"
before_script: before_script:
- cargo-fmt fmt -- --version - cargo fmt --version
script: script:
- cargo fmt - cargo fmt -- --check
# Clippy # Clippy
- env: CLIPPY_VERSION="0.0.212" - rust: stable
rust: nightly
install: install:
- travis_wait cargo install clippy --version $CLIPPY_VERSION || echo "clippy already installed" - rustup component add clippy-preview
script: script:
# Fail if clippy output contains "error:" or "warning:" # Fail if clippy output contains "error:" or "warning:"
- cargo clippy 2>&1 | tee ./clippy.out && ! grep -qe "error:\|warning:" ./clippy.out - cargo clippy 2>&1 | tee ./clippy.out && ! grep -qe "error:\|warning:" ./clippy.out
# Test coverage (with Tarpaulin) # 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) # To avoid "Error: EPERM: operation not permitted" error (see https://github.com/valery-barysok/session-file-store/issues/58)
sudo: true sudo: true
install: 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: script:
- cargo tarpaulin --ciserver travis-ci --coveralls $TRAVIS_JOB_ID - cargo tarpaulin -v --ciserver travis-ci --coveralls $TRAVIS_JOB_ID
script: script:
- cargo test - cargo test

View File

@ -7,12 +7,23 @@ use YaSerialize;
pub fn to_string<T: YaSerialize>(model: &T) -> Result<String, String> { pub fn to_string<T: YaSerialize>(model: &T) -> Result<String, String> {
let buf = Cursor::new(Vec::new()); 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"); let data = str::from_utf8(cursor.get_ref()).expect("Found invalid UTF-8");
Ok(String::from(data)) Ok(String::from(data))
} }
pub fn serialize_with_writer<W: Write, T: YaSerialize>(model: &T, writer: W) -> Result<W, String> { pub fn to_string_with_config<T: YaSerialize>(model: &T, config: &Config) -> Result<String, String> {
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<W: Write, T: YaSerialize>(
model: &T,
writer: W,
_config: &Config,
) -> Result<W, String> {
let mut serializer = Serializer::new_from_writer(writer); let mut serializer = Serializer::new_from_writer(writer);
match model.serialize(&mut serializer) { match model.serialize(&mut serializer) {
Ok(()) => Ok(serializer.into_inner()), Ok(()) => Ok(serializer.into_inner()),
@ -93,3 +104,19 @@ impl<'de, W: Write> Serializer<W> {
self.writer.write(event) self.writer.write(event)
} }
} }
pub struct Config {
pub perform_indent: bool,
pub write_document_declaration: bool,
pub indent_string: Option<String>,
}
impl Default for Config {
fn default() -> Self {
Config {
perform_indent: false,
write_document_declaration: true,
indent_string: None,
}
}
}

View File

@ -23,7 +23,7 @@ fn de_struct_namespace() {
root = "book", root = "book",
prefix = "ns", prefix = "ns",
namespace = "ns: http://www.sample.com/ns/domain", 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 { pub struct Book {
#[yaserde(prefix = "ns")] #[yaserde(prefix = "ns")]
@ -83,7 +83,10 @@ fn de_struct_namespace() {
<ns:title>Little prince</ns:title> <ns:title>Little prince</ns:title>
</ns:book>"#; </ns:book>"#;
let loaded: Result<Book, String> = from_str(content); let loaded: Result<Book, String> = 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] #[test]

View File

@ -36,7 +36,8 @@ fn se_default_field_string() {
}, },
content content
); );
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><background>my_value</background></base>"; let content =
"<?xml version=\"1.0\" encoding=\"utf-8\"?><base><background>my_value</background></base>";
convert_and_validate!( convert_and_validate!(
XmlStruct { XmlStruct {
background: "my_value".to_string(), background: "my_value".to_string(),
@ -61,13 +62,9 @@ fn se_default_field_boolean() {
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base />"; let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base />";
convert_and_validate!(XmlStruct { background: true }, content); convert_and_validate!(XmlStruct { background: true }, content);
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><background>false</background></base>"; let content =
convert_and_validate!( "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><background>false</background></base>";
XmlStruct { convert_and_validate!(XmlStruct { background: false }, content);
background: false,
},
content
);
} }
#[test] #[test]

View File

@ -11,9 +11,9 @@ documentation = "https://docs.rs/yaserde"
readme = "../README.md" readme = "../README.md"
[dependencies] [dependencies]
syn = { version = "0.15.22", features = ["visit", "extra-traits"] } syn = { version = "1.0.5", features = ["visit", "extra-traits"] }
proc-macro2 = "0.4.24" proc-macro2 = "1.0.5"
quote = "0.6.10" quote = "1.0.2"
[lib] [lib]
name = "yaserde_derive" name = "yaserde_derive"

View File

@ -40,7 +40,7 @@ impl YaSerdeAttribute {
let mut text = false; let mut text = false;
for attr in attrs.iter() { 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 Some(token) = attr_iter.next() {
if let TokenTree::Group(group) = token { if let TokenTree::Group(group) = token {
if group.delimiter() == Delimiter::Parenthesis { if group.delimiter() == Delimiter::Parenthesis {
@ -146,7 +146,7 @@ fn parse_attributes() {
leading_colon: None, leading_colon: None,
segments: punctuated, segments: punctuated,
}, },
tts: TokenStream::from_str("(attribute)").unwrap(), tokens: TokenStream::from_str("(attribute)").unwrap(),
}]; }];
let attrs = YaSerdeAttribute::parse(&attributes); let attrs = YaSerdeAttribute::parse(&attributes);

View File

@ -1,4 +1,3 @@
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use syn::Ident; use syn::Ident;

View File

@ -1,4 +1,5 @@
use attribute::*; use attribute::*;
use de::build_default_value::build_default_value;
use field_type::*; use field_type::*;
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::TokenStreamExt; use quote::TokenStreamExt;
@ -6,7 +7,6 @@ use std::collections::BTreeMap;
use syn::DataEnum; use syn::DataEnum;
use syn::Fields; use syn::Fields;
use syn::Ident; use syn::Ident;
use de::build_default_value::build_default_value;
pub fn parse( pub fn parse(
data_enum: &DataEnum, data_enum: &DataEnum,
@ -28,42 +28,72 @@ pub fn parse(
let field_attrs = YaSerdeAttribute::parse(&field.attrs); let field_attrs = YaSerdeAttribute::parse(&field.attrs);
match get_field_type(field) { match get_field_type(field) {
Some(FieldType::FieldTypeString) => { Some(FieldType::FieldTypeString) => build_default_value(
build_default_value(field_label, &quote! {String}, &quote! {"".to_string()}, &field_attrs.default) field_label,
} &quote! {String},
Some(FieldType::FieldTypeBool) => { &quote! {"".to_string()},
build_default_value(field_label, &quote! {bool}, &quote! {false}, &field_attrs.default) &field_attrs.default,
} ),
Some(FieldType::FieldTypeBool) => build_default_value(
field_label,
&quote! {bool},
&quote! {false},
&field_attrs.default,
),
Some(FieldType::FieldTypeI8) => { Some(FieldType::FieldTypeI8) => {
build_default_value(field_label, &quote! {i8}, &quote! {0}, &field_attrs.default) build_default_value(field_label, &quote! {i8}, &quote! {0}, &field_attrs.default)
} }
Some(FieldType::FieldTypeU8) => { Some(FieldType::FieldTypeU8) => {
build_default_value(field_label, &quote! {u8}, &quote! {0}, &field_attrs.default) build_default_value(field_label, &quote! {u8}, &quote! {0}, &field_attrs.default)
} }
Some(FieldType::FieldTypeI16) => { Some(FieldType::FieldTypeI16) => build_default_value(
build_default_value(field_label, &quote! {i16}, &quote! {0}, &field_attrs.default) field_label,
} &quote! {i16},
Some(FieldType::FieldTypeU16) => { &quote! {0},
build_default_value(field_label, &quote! {u16}, &quote! {0}, &field_attrs.default) &field_attrs.default,
} ),
Some(FieldType::FieldTypeI32) => { Some(FieldType::FieldTypeU16) => build_default_value(
build_default_value(field_label, &quote! {i32}, &quote! {0}, &field_attrs.default) field_label,
} &quote! {u16},
Some(FieldType::FieldTypeU32) => { &quote! {0},
build_default_value(field_label, &quote! {u32}, &quote! {0}, &field_attrs.default) &field_attrs.default,
} ),
Some(FieldType::FieldTypeI64) => { Some(FieldType::FieldTypeI32) => build_default_value(
build_default_value(field_label, &quote! {i64}, &quote! {0}, &field_attrs.default) field_label,
} &quote! {i32},
Some(FieldType::FieldTypeU64) => { &quote! {0},
build_default_value(field_label, &quote! {u64}, &quote! {0}, &field_attrs.default) &field_attrs.default,
} ),
Some(FieldType::FieldTypeF32) => { Some(FieldType::FieldTypeU32) => build_default_value(
build_default_value(field_label, &quote! {f32}, &quote! {0}, &field_attrs.default) field_label,
} &quote! {u32},
Some(FieldType::FieldTypeF64) => { &quote! {0},
build_default_value(field_label, &quote! {f64}, &quote! {0}, &field_attrs.default) &field_attrs.default,
} ),
Some(FieldType::FieldTypeI64) => build_default_value(
field_label,
&quote! {i64},
&quote! {0},
&field_attrs.default,
),
Some(FieldType::FieldTypeU64) => build_default_value(
field_label,
&quote! {u64},
&quote! {0},
&field_attrs.default,
),
Some(FieldType::FieldTypeF32) => build_default_value(
field_label,
&quote! {f32},
&quote! {0},
&field_attrs.default,
),
Some(FieldType::FieldTypeF64) => build_default_value(
field_label,
&quote! {f64},
&quote! {0},
&field_attrs.default,
),
Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value( Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value(
field_label, field_label,
&quote! {#struct_name}, &quote! {#struct_name},
@ -88,42 +118,78 @@ pub fn parse(
Some(FieldType::FieldTypeVec { data_type }) => { Some(FieldType::FieldTypeVec { data_type }) => {
let dt = Box::into_raw(data_type); let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } { match unsafe { dt.as_ref() } {
Some(&FieldType::FieldTypeString) => { Some(&FieldType::FieldTypeString) => build_default_value(
build_default_value(field_label, &quote! {Vec<String>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<String>},
Some(&FieldType::FieldTypeBool) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<bool>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeI8) => { Some(&FieldType::FieldTypeBool) => build_default_value(
build_default_value(field_label, &quote! {Vec<i8>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<bool>},
Some(&FieldType::FieldTypeU8) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<u8>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeI16) => { Some(&FieldType::FieldTypeI8) => build_default_value(
build_default_value(field_label, &quote! {Vec<i16>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<i8>},
Some(&FieldType::FieldTypeU16) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<u16>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeI32) => { Some(&FieldType::FieldTypeU8) => build_default_value(
build_default_value(field_label, &quote! {Vec<i32>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<u8>},
Some(&FieldType::FieldTypeU32) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<u32>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeI64) => { Some(&FieldType::FieldTypeI16) => build_default_value(
build_default_value(field_label, &quote! {Vec<i64>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<i16>},
Some(&FieldType::FieldTypeU64) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<u64>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeF32) => { Some(&FieldType::FieldTypeU16) => build_default_value(
build_default_value(field_label, &quote! {Vec<f32>}, &quote! {vec![]}, &field_attrs.default) field_label,
} &quote! {Vec<u16>},
Some(&FieldType::FieldTypeF64) => { &quote! {vec![]},
build_default_value(field_label, &quote! {Vec<f64>}, &quote! {vec![]}, &field_attrs.default) &field_attrs.default,
} ),
Some(&FieldType::FieldTypeI32) => build_default_value(
field_label,
&quote! {Vec<i32>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeU32) => build_default_value(
field_label,
&quote! {Vec<u32>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeI64) => build_default_value(
field_label,
&quote! {Vec<i64>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeU64) => build_default_value(
field_label,
&quote! {Vec<u64>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeF32) => build_default_value(
field_label,
&quote! {Vec<f32>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeF64) => build_default_value(
field_label,
&quote! {Vec<f64>},
&quote! {vec![]},
&field_attrs.default,
),
Some(&FieldType::FieldTypeStruct { ref struct_name }) => build_default_value( Some(&FieldType::FieldTypeStruct { ref struct_name }) => build_default_value(
field_label, field_label,
&quote! {Vec<#struct_name>}, &quote! {Vec<#struct_name>},

View File

@ -1,11 +1,11 @@
use attribute::*; use attribute::*;
use de::build_default_value::build_default_value;
use field_type::*; use field_type::*;
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::TokenStreamExt; use quote::TokenStreamExt;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use syn::DataStruct; use syn::DataStruct;
use syn::Ident; use syn::Ident;
use de::build_default_value::build_default_value;
pub fn parse( pub fn parse(
data_struct: &DataStruct, data_struct: &DataStruct,
@ -14,7 +14,6 @@ pub fn parse(
prefix: &Option<String>, prefix: &Option<String>,
namespaces: &BTreeMap<String, String>, namespaces: &BTreeMap<String, String>,
) -> TokenStream { ) -> TokenStream {
let namespaces_matches: TokenStream = namespaces let namespaces_matches: TokenStream = namespaces
.iter() .iter()
.map(|(p, ns)| { .map(|(p, ns)| {
@ -397,14 +396,12 @@ pub fn parse(
return None; 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() Ident::new(&value.to_string(), Span::call_site()).to_string()
} else { } else {
field.ident.clone().unwrap().to_string() field.ident.clone().unwrap().to_string()
}; };
let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site());
match get_field_type(field) { match get_field_type(field) {
Some(FieldType::FieldTypeString) => { Some(FieldType::FieldTypeString) => {
let visitor = Ident::new("visit_str", Span::call_site()); let visitor = Ident::new("visit_str", Span::call_site());
@ -412,10 +409,8 @@ pub fn parse(
&quote! {String}, &quote! {String},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -425,10 +420,8 @@ pub fn parse(
&quote! {bool}, &quote! {bool},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -438,10 +431,8 @@ pub fn parse(
&quote! {i8}, &quote! {i8},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -451,10 +442,8 @@ pub fn parse(
&quote! {u8}, &quote! {u8},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -464,10 +453,8 @@ pub fn parse(
&quote! {u16}, &quote! {u16},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -477,10 +464,8 @@ pub fn parse(
&quote! {i16}, &quote! {i16},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -490,10 +475,8 @@ pub fn parse(
&quote! {u32}, &quote! {u32},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -503,10 +486,8 @@ pub fn parse(
&quote! {i32}, &quote! {i32},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -516,10 +497,8 @@ pub fn parse(
&quote! {u64}, &quote! {u64},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -529,10 +508,8 @@ pub fn parse(
&quote! {i64}, &quote! {i64},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -542,10 +519,8 @@ pub fn parse(
&quote! {f32}, &quote! {f32},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -555,10 +530,8 @@ pub fn parse(
&quote! {f64}, &quote! {f64},
&visitor, &visitor,
&quote! {= value}, &quote! {= value},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -585,10 +558,8 @@ pub fn parse(
&quote! {String}, &quote! {String},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -598,10 +569,8 @@ pub fn parse(
&quote! {bool}, &quote! {bool},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -611,10 +580,8 @@ pub fn parse(
&quote! {u8}, &quote! {u8},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -624,10 +591,8 @@ pub fn parse(
&quote! {i8}, &quote! {i8},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -637,10 +602,8 @@ pub fn parse(
&quote! {u16}, &quote! {u16},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -650,10 +613,8 @@ pub fn parse(
&quote! {i16}, &quote! {i16},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -663,10 +624,8 @@ pub fn parse(
&quote! {u32}, &quote! {u32},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -676,10 +635,8 @@ pub fn parse(
&quote! {i32}, &quote! {i32},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -689,10 +646,8 @@ pub fn parse(
&quote! {u64}, &quote! {u64},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -702,10 +657,8 @@ pub fn parse(
&quote! {i64}, &quote! {i64},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -715,10 +668,8 @@ pub fn parse(
&quote! {f32}, &quote! {f32},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -728,10 +679,8 @@ pub fn parse(
&quote! {f64}, &quote! {f64},
&visitor, &visitor,
&quote! {= Some(value)}, &quote! {= Some(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -764,10 +713,8 @@ pub fn parse(
&quote! {String}, &quote! {String},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -777,10 +724,8 @@ pub fn parse(
&quote! {bool}, &quote! {bool},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -790,10 +735,8 @@ pub fn parse(
&quote! {i8}, &quote! {i8},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -803,10 +746,8 @@ pub fn parse(
&quote! {u8}, &quote! {u8},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -816,10 +757,8 @@ pub fn parse(
&quote! {i16}, &quote! {i16},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -829,10 +768,8 @@ pub fn parse(
&quote! {u16}, &quote! {u16},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -842,10 +779,8 @@ pub fn parse(
&quote! {i32}, &quote! {i32},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -855,10 +790,8 @@ pub fn parse(
&quote! {u32}, &quote! {u32},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -868,10 +801,8 @@ pub fn parse(
&quote! {i64}, &quote! {i64},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -881,10 +812,8 @@ pub fn parse(
&quote! {u64}, &quote! {u64},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -894,10 +823,8 @@ pub fn parse(
&quote! {f32}, &quote! {f32},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -907,10 +834,8 @@ pub fn parse(
&quote! {f64}, &quote! {f64},
&visitor, &visitor,
&quote! {.push(value)}, &quote! {.push(value)},
&visitor_label, &field_attrs,
label, label,
&label_name,
&field_attrs.prefix,
&namespaces, &namespaces,
) )
} }
@ -1355,18 +1280,25 @@ fn build_call_visitor(
field_type: &TokenStream, field_type: &TokenStream,
visitor: &Ident, visitor: &Ident,
action: &TokenStream, action: &TokenStream,
visitor_label: &Ident, field_attrs: &YaSerdeAttribute,
label: &Option<Ident>, label: &Option<Ident>,
label_name: &str,
prefix: &Option<String>,
namespaces: &BTreeMap<String, String>, namespaces: &BTreeMap<String, String>,
) -> Option<TokenStream> { ) -> Option<TokenStream> {
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 let namespaces_matches: TokenStream = namespaces
.iter() .iter()
.map(|(p, ns)| { .map(|(p, ns)| {
let str_ns = ns.as_str(); let str_ns = ns.as_str();
if *prefix == Some(p.to_string()) { if prefix == Some(p.to_string()) {
Some(quote!(#str_ns => {})) Some(quote!(#str_ns => {}))
} else { } else {
None None

View File

@ -1,4 +1,3 @@
pub mod build_default_value; pub mod build_default_value;
pub mod expand_enum; pub mod expand_enum;
pub mod expand_struct; pub mod expand_struct;
@ -17,9 +16,13 @@ pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result<TokenStream,
let root = root_attrs.clone().root.unwrap_or_else(|| name.to_string()); let root = root_attrs.clone().root.unwrap_or_else(|| name.to_string());
let impl_block = match *data { let impl_block = match *data {
syn::Data::Struct(ref data_struct) => { syn::Data::Struct(ref data_struct) => expand_struct::parse(
expand_struct::parse(data_struct, name, &root, &root_attrs.prefix, &root_attrs.namespaces) data_struct,
} name,
&root,
&root_attrs.prefix,
&root_attrs.namespaces,
),
syn::Data::Enum(ref data_enum) => { syn::Data::Enum(ref data_enum) => {
expand_enum::parse(data_enum, name, &root, &root_attrs.namespaces) expand_enum::parse(data_enum, name, &root, &root_attrs.namespaces)
} }

View File

@ -1,5 +1,4 @@
use syn; use syn;
use syn::punctuated::Pair;
use syn::Type::Path; use syn::Type::Path;
#[derive(Debug)] #[derive(Debug)]
@ -56,7 +55,7 @@ pub fn get_field_type(field: &syn::Field) -> Option<FieldType> {
return None; return None;
} }
match path.path.segments.first() { match path.path.segments.first() {
Some(Pair::End(t)) => FieldType::from_ident(t), Some(path_segment) => FieldType::from_ident(path_segment),
_ => None, _ => None,
} }
} }
@ -66,10 +65,10 @@ pub fn get_field_type(field: &syn::Field) -> Option<FieldType> {
fn get_sub_type(t: &syn::PathSegment) -> Option<syn::PathSegment> { fn get_sub_type(t: &syn::PathSegment) -> Option<syn::PathSegment> {
if let syn::PathArguments::AngleBracketed(ref args) = t.arguments { 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 syn::GenericArgument::Type(ref argument) = *tt {
if let Path(ref path2) = *argument { 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()); return Some(ttt.clone());
} }
} }

View File

@ -1,11 +1,6 @@
use proc_macro2::{Ident, Span, TokenStream}; 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! { quote! {
let start_event = XmlEvent::start_element(#label_name); let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event); let _ret = writer.write(start_event);
@ -19,10 +14,7 @@ pub fn enclose_formatted_characters(
} }
} }
pub fn enclose_formatted_characters_for_value( pub fn enclose_formatted_characters_for_value(label: &Ident, label_name: String) -> TokenStream {
label: &Ident,
label_name: String
) -> TokenStream {
quote! { quote! {
let start_event = XmlEvent::start_element(#label_name); let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event); let _ret = writer.write(start_event);
@ -36,10 +28,7 @@ pub fn enclose_formatted_characters_for_value(
} }
} }
pub fn enclose_characters( pub fn enclose_characters(label: &Option<Ident>, label_name: String) -> TokenStream {
label: &Option<Ident>,
label_name: String
) -> TokenStream {
quote! { quote! {
let start_event = XmlEvent::start_element(#label_name); let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event); let _ret = writer.write(start_event);

View File

@ -79,7 +79,7 @@ pub fn serialize(
}); });
}) })
} }
}, }
Some(FieldType::FieldTypeOption { data_type }) => { Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type); let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } { match unsafe { dt.as_ref() } {
@ -108,7 +108,7 @@ pub fn serialize(
}; };
}) })
} }
}, }
Some(&FieldType::FieldTypeBool) Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8) | Some(&FieldType::FieldTypeU8)
@ -160,7 +160,7 @@ pub fn serialize(
}; };
}) })
} }
}, }
Some(&FieldType::FieldTypeVec { .. }) => { Some(&FieldType::FieldTypeVec { .. }) => {
let item_ident = Ident::new("yas_item", Span::call_site()); let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters(&item_ident, label_name); let inner = enclose_formatted_characters(&item_ident, label_name);
@ -184,7 +184,7 @@ pub fn serialize(
} }
}) })
} }
}, }
_ => unimplemented!(), _ => unimplemented!(),
} }
} }
@ -228,7 +228,7 @@ pub fn serialize(
}); });
}) })
} }
}, }
_ => None, _ => None,
} }
}) })
@ -293,8 +293,9 @@ pub fn serialize(
| Some(FieldType::FieldTypeI64) | Some(FieldType::FieldTypeI64)
| Some(FieldType::FieldTypeU64) | Some(FieldType::FieldTypeU64)
| Some(FieldType::FieldTypeF32) | Some(FieldType::FieldTypeF32)
| Some(FieldType::FieldTypeF64) => | Some(FieldType::FieldTypeF64) => {
serialize_element(label, label_name, &field_attrs.default), serialize_element(label, label_name, &field_attrs.default)
}
Some(FieldType::FieldTypeOption { data_type }) => { Some(FieldType::FieldTypeOption { data_type }) => {
let dt = Box::into_raw(data_type); let dt = Box::into_raw(data_type);
match unsafe { dt.as_ref() } { match unsafe { dt.as_ref() } {
@ -330,7 +331,7 @@ pub fn serialize(
} }
}) })
} }
}, }
Some(&FieldType::FieldTypeVec { .. }) => { Some(&FieldType::FieldTypeVec { .. }) => {
let item_ident = Ident::new("yas_item", Span::call_site()); let item_ident = Ident::new("yas_item", Span::call_site());
let inner = enclose_formatted_characters_for_value(&item_ident, label_name); let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
@ -356,7 +357,7 @@ 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()));
@ -416,7 +417,7 @@ pub fn serialize(
#inner #inner
} }
}) })
}, }
Some(&FieldType::FieldTypeBool) Some(&FieldType::FieldTypeBool)
| Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeI8)
| Some(&FieldType::FieldTypeU8) | Some(&FieldType::FieldTypeU8)
@ -436,7 +437,7 @@ pub fn serialize(
#inner #inner
} }
}) })
}, }
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 {

View File

@ -1,4 +1,3 @@
pub mod element; pub mod element;
pub mod expand_enum; pub mod expand_enum;
pub mod expand_struct; pub mod expand_struct;