commit
bb36546d2e
31
.travis.yml
31
.travis.yml
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -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]
|
||||||
|
|||||||
@ -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]
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
use proc_macro2::{Span, TokenStream};
|
use proc_macro2::{Span, TokenStream};
|
||||||
use syn::Ident;
|
use syn::Ident;
|
||||||
|
|
||||||
|
|||||||
@ -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, "e! {String}, "e! {"".to_string()}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {String},
|
||||||
Some(FieldType::FieldTypeBool) => {
|
"e! {"".to_string()},
|
||||||
build_default_value(field_label, "e! {bool}, "e! {false}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
|
Some(FieldType::FieldTypeBool) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {bool},
|
||||||
|
"e! {false},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
Some(FieldType::FieldTypeI8) => {
|
Some(FieldType::FieldTypeI8) => {
|
||||||
build_default_value(field_label, "e! {i8}, "e! {0}, &field_attrs.default)
|
build_default_value(field_label, "e! {i8}, "e! {0}, &field_attrs.default)
|
||||||
}
|
}
|
||||||
Some(FieldType::FieldTypeU8) => {
|
Some(FieldType::FieldTypeU8) => {
|
||||||
build_default_value(field_label, "e! {u8}, "e! {0}, &field_attrs.default)
|
build_default_value(field_label, "e! {u8}, "e! {0}, &field_attrs.default)
|
||||||
}
|
}
|
||||||
Some(FieldType::FieldTypeI16) => {
|
Some(FieldType::FieldTypeI16) => build_default_value(
|
||||||
build_default_value(field_label, "e! {i16}, "e! {0}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {i16},
|
||||||
Some(FieldType::FieldTypeU16) => {
|
"e! {0},
|
||||||
build_default_value(field_label, "e! {u16}, "e! {0}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(FieldType::FieldTypeI32) => {
|
Some(FieldType::FieldTypeU16) => build_default_value(
|
||||||
build_default_value(field_label, "e! {i32}, "e! {0}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {u16},
|
||||||
Some(FieldType::FieldTypeU32) => {
|
"e! {0},
|
||||||
build_default_value(field_label, "e! {u32}, "e! {0}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(FieldType::FieldTypeI64) => {
|
Some(FieldType::FieldTypeI32) => build_default_value(
|
||||||
build_default_value(field_label, "e! {i64}, "e! {0}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {i32},
|
||||||
Some(FieldType::FieldTypeU64) => {
|
"e! {0},
|
||||||
build_default_value(field_label, "e! {u64}, "e! {0}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(FieldType::FieldTypeF32) => {
|
Some(FieldType::FieldTypeU32) => build_default_value(
|
||||||
build_default_value(field_label, "e! {f32}, "e! {0}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {u32},
|
||||||
Some(FieldType::FieldTypeF64) => {
|
"e! {0},
|
||||||
build_default_value(field_label, "e! {f64}, "e! {0}, &field_attrs.default)
|
&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(
|
Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value(
|
||||||
field_label,
|
field_label,
|
||||||
"e! {#struct_name},
|
"e! {#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, "e! {Vec<String>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<String>},
|
||||||
Some(&FieldType::FieldTypeBool) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<bool>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(&FieldType::FieldTypeI8) => {
|
Some(&FieldType::FieldTypeBool) => build_default_value(
|
||||||
build_default_value(field_label, "e! {Vec<i8>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<bool>},
|
||||||
Some(&FieldType::FieldTypeU8) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<u8>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(&FieldType::FieldTypeI16) => {
|
Some(&FieldType::FieldTypeI8) => build_default_value(
|
||||||
build_default_value(field_label, "e! {Vec<i16>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<i8>},
|
||||||
Some(&FieldType::FieldTypeU16) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<u16>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(&FieldType::FieldTypeI32) => {
|
Some(&FieldType::FieldTypeU8) => build_default_value(
|
||||||
build_default_value(field_label, "e! {Vec<i32>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<u8>},
|
||||||
Some(&FieldType::FieldTypeU32) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<u32>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(&FieldType::FieldTypeI64) => {
|
Some(&FieldType::FieldTypeI16) => build_default_value(
|
||||||
build_default_value(field_label, "e! {Vec<i64>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<i16>},
|
||||||
Some(&FieldType::FieldTypeU64) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<u64>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
Some(&FieldType::FieldTypeF32) => {
|
Some(&FieldType::FieldTypeU16) => build_default_value(
|
||||||
build_default_value(field_label, "e! {Vec<f32>}, "e! {vec![]}, &field_attrs.default)
|
field_label,
|
||||||
}
|
"e! {Vec<u16>},
|
||||||
Some(&FieldType::FieldTypeF64) => {
|
"e! {vec![]},
|
||||||
build_default_value(field_label, "e! {Vec<f64>}, "e! {vec![]}, &field_attrs.default)
|
&field_attrs.default,
|
||||||
}
|
),
|
||||||
|
Some(&FieldType::FieldTypeI32) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<i32>},
|
||||||
|
"e! {vec![]},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
|
Some(&FieldType::FieldTypeU32) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<u32>},
|
||||||
|
"e! {vec![]},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
|
Some(&FieldType::FieldTypeI64) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<i64>},
|
||||||
|
"e! {vec![]},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
|
Some(&FieldType::FieldTypeU64) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<u64>},
|
||||||
|
"e! {vec![]},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
|
Some(&FieldType::FieldTypeF32) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<f32>},
|
||||||
|
"e! {vec![]},
|
||||||
|
&field_attrs.default,
|
||||||
|
),
|
||||||
|
Some(&FieldType::FieldTypeF64) => build_default_value(
|
||||||
|
field_label,
|
||||||
|
"e! {Vec<f64>},
|
||||||
|
"e! {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,
|
||||||
"e! {Vec<#struct_name>},
|
"e! {Vec<#struct_name>},
|
||||||
|
|||||||
@ -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(
|
|||||||
"e! {String},
|
"e! {String},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -425,10 +420,8 @@ pub fn parse(
|
|||||||
"e! {bool},
|
"e! {bool},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -438,10 +431,8 @@ pub fn parse(
|
|||||||
"e! {i8},
|
"e! {i8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -451,10 +442,8 @@ pub fn parse(
|
|||||||
"e! {u8},
|
"e! {u8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -464,10 +453,8 @@ pub fn parse(
|
|||||||
"e! {u16},
|
"e! {u16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -477,10 +464,8 @@ pub fn parse(
|
|||||||
"e! {i16},
|
"e! {i16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -490,10 +475,8 @@ pub fn parse(
|
|||||||
"e! {u32},
|
"e! {u32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -503,10 +486,8 @@ pub fn parse(
|
|||||||
"e! {i32},
|
"e! {i32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -516,10 +497,8 @@ pub fn parse(
|
|||||||
"e! {u64},
|
"e! {u64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -529,10 +508,8 @@ pub fn parse(
|
|||||||
"e! {i64},
|
"e! {i64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -542,10 +519,8 @@ pub fn parse(
|
|||||||
"e! {f32},
|
"e! {f32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -555,10 +530,8 @@ pub fn parse(
|
|||||||
"e! {f64},
|
"e! {f64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= value},
|
"e! {= value},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -585,10 +558,8 @@ pub fn parse(
|
|||||||
"e! {String},
|
"e! {String},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -598,10 +569,8 @@ pub fn parse(
|
|||||||
"e! {bool},
|
"e! {bool},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -611,10 +580,8 @@ pub fn parse(
|
|||||||
"e! {u8},
|
"e! {u8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -624,10 +591,8 @@ pub fn parse(
|
|||||||
"e! {i8},
|
"e! {i8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -637,10 +602,8 @@ pub fn parse(
|
|||||||
"e! {u16},
|
"e! {u16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -650,10 +613,8 @@ pub fn parse(
|
|||||||
"e! {i16},
|
"e! {i16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -663,10 +624,8 @@ pub fn parse(
|
|||||||
"e! {u32},
|
"e! {u32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -676,10 +635,8 @@ pub fn parse(
|
|||||||
"e! {i32},
|
"e! {i32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -689,10 +646,8 @@ pub fn parse(
|
|||||||
"e! {u64},
|
"e! {u64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -702,10 +657,8 @@ pub fn parse(
|
|||||||
"e! {i64},
|
"e! {i64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -715,10 +668,8 @@ pub fn parse(
|
|||||||
"e! {f32},
|
"e! {f32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -728,10 +679,8 @@ pub fn parse(
|
|||||||
"e! {f64},
|
"e! {f64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {= Some(value)},
|
"e! {= Some(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -764,10 +713,8 @@ pub fn parse(
|
|||||||
"e! {String},
|
"e! {String},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -777,10 +724,8 @@ pub fn parse(
|
|||||||
"e! {bool},
|
"e! {bool},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -790,10 +735,8 @@ pub fn parse(
|
|||||||
"e! {i8},
|
"e! {i8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -803,10 +746,8 @@ pub fn parse(
|
|||||||
"e! {u8},
|
"e! {u8},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -816,10 +757,8 @@ pub fn parse(
|
|||||||
"e! {i16},
|
"e! {i16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -829,10 +768,8 @@ pub fn parse(
|
|||||||
"e! {u16},
|
"e! {u16},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -842,10 +779,8 @@ pub fn parse(
|
|||||||
"e! {i32},
|
"e! {i32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -855,10 +790,8 @@ pub fn parse(
|
|||||||
"e! {u32},
|
"e! {u32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -868,10 +801,8 @@ pub fn parse(
|
|||||||
"e! {i64},
|
"e! {i64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -881,10 +812,8 @@ pub fn parse(
|
|||||||
"e! {u64},
|
"e! {u64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -894,10 +823,8 @@ pub fn parse(
|
|||||||
"e! {f32},
|
"e! {f32},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.push(value)},
|
||||||
&visitor_label,
|
&field_attrs,
|
||||||
label,
|
label,
|
||||||
&label_name,
|
|
||||||
&field_attrs.prefix,
|
|
||||||
&namespaces,
|
&namespaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -907,10 +834,8 @@ pub fn parse(
|
|||||||
"e! {f64},
|
"e! {f64},
|
||||||
&visitor,
|
&visitor,
|
||||||
"e! {.push(value)},
|
"e! {.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
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user