Merge pull request #66 from media-io/fix_default_namespace_prefix
Fix default namespace prefix
This commit is contained in:
commit
62da5f17f2
12
.travis.yml
12
.travis.yml
@ -2,10 +2,12 @@ language: rust
|
||||
rust:
|
||||
- 1.36.0
|
||||
- 1.37.0
|
||||
- 1.38.0
|
||||
- 1.39.0
|
||||
# error on cfg(doctest)
|
||||
# - 1.38.0
|
||||
# - 1.39.0
|
||||
- 1.40.0
|
||||
- 1.41.0
|
||||
- 1.42.0
|
||||
- stable
|
||||
- beta
|
||||
- nightly
|
||||
@ -22,6 +24,8 @@ matrix:
|
||||
- cargo fmt --version
|
||||
script:
|
||||
- cargo fmt -- --check
|
||||
env:
|
||||
- CHECK_FORMAT=true
|
||||
|
||||
# Clippy
|
||||
- rust: stable
|
||||
@ -30,6 +34,8 @@ matrix:
|
||||
script:
|
||||
# Fail if clippy output contains "error:" or "warning:"
|
||||
- cargo clippy 2>&1 | tee ./clippy.out && ! grep -qe "error:\|warning:" ./clippy.out
|
||||
env:
|
||||
- CHECK_SYNTAX=true
|
||||
|
||||
# Test coverage (with Tarpaulin)
|
||||
- rust: stable
|
||||
@ -39,6 +45,8 @@ matrix:
|
||||
- RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin --force
|
||||
script:
|
||||
- cargo tarpaulin -v --ciserver travis-ci --coveralls $TRAVIS_JOB_ID
|
||||
env:
|
||||
- COVERAGE_MEASUREMENT=true
|
||||
|
||||
script:
|
||||
- cargo test
|
||||
|
@ -9,6 +9,7 @@ repository = "https://github.com/media-io/yaserde"
|
||||
homepage = "https://github.com/media-io/yaserde"
|
||||
documentation = "https://docs.rs/yaserde"
|
||||
readme = "../README.md"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
yaserde_derive = { version = "0.3.11", path = "../yaserde_derive", optional = true }
|
||||
|
@ -1,10 +1,10 @@
|
||||
//! Generic data structure deserialization framework.
|
||||
//!
|
||||
|
||||
use crate::YaDeserialize;
|
||||
use std::io::Read;
|
||||
use xml::name::OwnedName;
|
||||
use xml::reader::{EventReader, ParserConfig, XmlEvent};
|
||||
use YaDeserialize;
|
||||
|
||||
pub fn from_str<T: YaDeserialize>(s: &str) -> Result<T, String> {
|
||||
from_reader(s.as_bytes())
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
|
||||
#[cfg(feature = "yaserde_derive")]
|
||||
#[allow(unused_imports)]
|
||||
#[macro_use]
|
||||
|
@ -1,12 +1,12 @@
|
||||
//! Generic data structure serialization framework.
|
||||
//!
|
||||
|
||||
use crate::YaSerialize;
|
||||
use std::io::{Cursor, Write};
|
||||
use std::str;
|
||||
use xml;
|
||||
use xml::writer::XmlEvent;
|
||||
use xml::{EmitterConfig, EventWriter};
|
||||
use YaSerialize;
|
||||
|
||||
pub fn to_string<T: YaSerialize>(model: &T) -> Result<String, String> {
|
||||
let buf = Cursor::new(Vec::new());
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,8 +1,4 @@
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
use std::io::Read;
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
@ -182,6 +179,29 @@ fn ser_struct_default_namespace_via_attribute() {
|
||||
convert_and_validate!(model, content);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ser_struct_default_namespace_via_attribute_with_prefix() {
|
||||
#[derive(YaSerialize, PartialEq, Debug)]
|
||||
#[yaserde(
|
||||
root = "tt",
|
||||
prefix = "TTML",
|
||||
default_namespace = "TTML",
|
||||
namespace = "TTML: http://www.w3.org/ns/ttml",
|
||||
namespace = "ttm: http://www.w3.org/ns/ttml#metadata"
|
||||
)]
|
||||
pub struct XmlStruct {
|
||||
#[yaserde(prefix = "TTML")]
|
||||
item: String,
|
||||
}
|
||||
|
||||
let model = XmlStruct {
|
||||
item: "something".to_string(),
|
||||
};
|
||||
|
||||
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:ttm=\"http://www.w3.org/ns/ttml#metadata\"><item>something</item></tt>";
|
||||
convert_and_validate!(model, content);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ser_struct_namespace_nested() {
|
||||
#[derive(YaSerialize, Default, PartialEq, Debug)]
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
|
@ -1,6 +1,3 @@
|
||||
extern crate log;
|
||||
extern crate xml;
|
||||
extern crate yaserde;
|
||||
#[macro_use]
|
||||
extern crate yaserde_derive;
|
||||
|
||||
|
@ -9,6 +9,7 @@ repository = "https://github.com/media-io/yaserde"
|
||||
homepage = "https://github.com/media-io/yaserde"
|
||||
documentation = "https://docs.rs/yaserde"
|
||||
readme = "../README.md"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
syn = { version = "~1.0", features = ["visit", "extra-traits"] }
|
||||
|
@ -1,5 +1,5 @@
|
||||
use attribute::*;
|
||||
use field_type::*;
|
||||
use crate::attribute::*;
|
||||
use crate::field_type::*;
|
||||
use proc_macro2::TokenStream;
|
||||
use std::collections::BTreeMap;
|
||||
use syn::spanned::Spanned;
|
||||
|
@ -1,6 +1,6 @@
|
||||
use attribute::*;
|
||||
use de::build_default_value::build_default_value;
|
||||
use field_type::*;
|
||||
use crate::attribute::*;
|
||||
use crate::de::build_default_value::build_default_value;
|
||||
use crate::field_type::*;
|
||||
use proc_macro2::{Span, TokenStream};
|
||||
use std::collections::BTreeMap;
|
||||
use syn::spanned::Spanned;
|
||||
|
@ -2,7 +2,7 @@ pub mod build_default_value;
|
||||
pub mod expand_enum;
|
||||
pub mod expand_struct;
|
||||
|
||||
use attribute;
|
||||
use crate::attribute;
|
||||
use proc_macro2::TokenStream;
|
||||
use syn;
|
||||
use syn::Ident;
|
||||
|
@ -1,4 +1,4 @@
|
||||
use attribute::*;
|
||||
use crate::attribute::*;
|
||||
use proc_macro2::{Ident, Span, TokenStream};
|
||||
|
||||
pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream {
|
||||
|
@ -1,5 +1,5 @@
|
||||
use attribute::*;
|
||||
use field_type::*;
|
||||
use crate::attribute::*;
|
||||
use crate::field_type::*;
|
||||
use proc_macro2::TokenStream;
|
||||
use std::collections::BTreeMap;
|
||||
use syn::spanned::Spanned;
|
||||
|
@ -1,5 +1,6 @@
|
||||
use attribute::*;
|
||||
use field_type::*;
|
||||
use crate::attribute::*;
|
||||
use crate::field_type::*;
|
||||
use crate::ser::element::*;
|
||||
use proc_macro2::TokenStream;
|
||||
use std::collections::BTreeMap;
|
||||
use std::string::ToString;
|
||||
@ -7,8 +8,6 @@ use syn::spanned::Spanned;
|
||||
use syn::DataStruct;
|
||||
use syn::Ident;
|
||||
|
||||
use ser::element::*;
|
||||
|
||||
pub fn serialize(
|
||||
data_struct: &DataStruct,
|
||||
name: &Ident,
|
||||
@ -27,7 +26,7 @@ pub fn serialize(
|
||||
|
||||
let label = &field.ident;
|
||||
|
||||
let label_name = build_label_name(&field, &field_attrs);
|
||||
let label_name = build_label_name(&field, &field_attrs, default_namespace);
|
||||
|
||||
get_field_type(field).and_then(|f| match f {
|
||||
FieldType::FieldTypeString
|
||||
@ -240,7 +239,7 @@ pub fn serialize(
|
||||
));
|
||||
}
|
||||
|
||||
let label_name = build_label_name(&field, &field_attrs);
|
||||
let label_name = build_label_name(&field, &field_attrs, default_namespace);
|
||||
let conditions = condition_generator(label, &field_attrs);
|
||||
|
||||
get_field_type(field).and_then(|f| match f {
|
||||
@ -411,16 +410,24 @@ pub fn serialize(
|
||||
}
|
||||
}
|
||||
|
||||
fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute) -> String {
|
||||
format!(
|
||||
"{}{}",
|
||||
fn build_label_name(
|
||||
field: &syn::Field,
|
||||
field_attrs: &YaSerdeAttribute,
|
||||
default_namespace: &Option<String>,
|
||||
) -> String {
|
||||
let prefix = if default_namespace == &field_attrs.prefix {
|
||||
"".to_string()
|
||||
} else {
|
||||
field_attrs
|
||||
.prefix
|
||||
.clone()
|
||||
.map_or("".to_string(), |prefix| prefix + ":"),
|
||||
field_attrs
|
||||
.rename
|
||||
.clone()
|
||||
.unwrap_or_else(|| field.ident.as_ref().unwrap().to_string())
|
||||
)
|
||||
.map_or("".to_string(), |prefix| prefix + ":")
|
||||
};
|
||||
|
||||
let label = field_attrs
|
||||
.rename
|
||||
.clone()
|
||||
.unwrap_or_else(|| field.ident.as_ref().unwrap().to_string());
|
||||
|
||||
format!("{}{}", prefix, label)
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ pub mod element;
|
||||
pub mod expand_enum;
|
||||
pub mod expand_struct;
|
||||
|
||||
use attribute;
|
||||
use crate::attribute;
|
||||
use proc_macro2::TokenStream;
|
||||
use syn;
|
||||
use syn::Ident;
|
||||
@ -15,12 +15,16 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<TokenStream, St
|
||||
let root_attrs = attribute::YaSerdeAttribute::parse(attrs);
|
||||
let root = root_attrs.clone().root.unwrap_or_else(|| name.to_string());
|
||||
|
||||
let root = if let Some(prefix) = root_attrs.prefix {
|
||||
prefix + ":" + &root
|
||||
let prefix = if root_attrs.default_namespace == root_attrs.prefix {
|
||||
"".to_string()
|
||||
} else {
|
||||
root
|
||||
root_attrs
|
||||
.prefix
|
||||
.map_or("".to_string(), |prefix| prefix + ":")
|
||||
};
|
||||
|
||||
let root = format!("{}{}", prefix, root);
|
||||
|
||||
let impl_block = match *data {
|
||||
syn::Data::Struct(ref data_struct) => expand_struct::serialize(
|
||||
data_struct,
|
||||
|
Loading…
Reference in New Issue
Block a user