diff --git a/.travis.yml b/.travis.yml index e15070e..d56f24c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,11 @@ language: rust rust: + # error on #[non_exhaustive] being "experimental" + # - 1.36.0 + # - 1.37.0 + # error on cfg(doctest) + # - 1.38.0 + # - 1.39.0 - 1.40.0 - 1.41.0 - 1.42.0 diff --git a/Cargo.toml b/Cargo.toml index fe4f64d..d5e249a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,4 +2,5 @@ members = [ "yaserde", "yaserde_derive", + "examples", ] diff --git a/examples/Cargo.toml b/examples/Cargo.toml new file mode 100644 index 0000000..049a067 --- /dev/null +++ b/examples/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "yaserde-examples" +version = "0.0.1" +authors = ["Marc-Antoine Arnaud "] +license = "MIT" +edition = "2018" + +[dependencies] +yaserde = {version = "0.5.1", path = "../yaserde" } +yaserde_derive = {version = "0.5.1", path = "../yaserde_derive" } +xml-rs = "0.8.0" +log = "0.4" +simple_logger = "1.0" diff --git a/examples/src/bbigras_namespace.rs b/examples/src/bbigras_namespace.rs new file mode 100644 index 0000000..2093db1 --- /dev/null +++ b/examples/src/bbigras_namespace.rs @@ -0,0 +1,106 @@ +// related to issue https://github.com/media-io/yaserde/issues/15 + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +#[yaserde( + prefix = "ss", + namespace = "x: urn:schemas-microsoft-com:office:excel", + namespace = "ss: urn:schemas-microsoft-com:office:spreadsheet", + namespace = "o: urn:schemas-microsoft-com:office:office", + namespace = "html: http://www.w3.org/TR/REC-html40" +)] +struct Workbook { + #[yaserde(rename = "Worksheet")] + worksheet: Worksheet, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +#[yaserde( + prefix = "ss", + namespace = "x: urn:schemas-microsoft-com:office:excel", + namespace = "ss: urn:schemas-microsoft-com:office:spreadsheet", + namespace = "o: urn:schemas-microsoft-com:office:office", + namespace = "html: http://www.w3.org/TR/REC-html40" +)] +struct Worksheet { + #[yaserde(rename = "Table")] + table: Table, + #[yaserde(attribute, rename = "Name", prefix = "ss")] + ws_name: String, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +#[yaserde( + prefix = "ss", + namespace = "x: urn:schemas-microsoft-com:office:excel", + namespace = "ss: urn:schemas-microsoft-com:office:spreadsheet", + namespace = "o: urn:schemas-microsoft-com:office:office", + namespace = "html: http://www.w3.org/TR/REC-html40" +)] +struct Table { + #[yaserde(attribute, rename = "ExpandedColumnCount", prefix = "ss")] + expanded_column_count: u32, + #[yaserde(attribute, rename = "ExpandedRowCount", prefix = "ss")] + expanded_row_count: u32, + #[yaserde(attribute, rename = "FullColumns", prefix = "x")] + full_columns: u32, + #[yaserde(attribute, rename = "FullRows", prefix = "x")] + full_rows: u32, + #[yaserde(attribute, rename = "StyleID", prefix = "ss")] + style_id: String, + #[yaserde(attribute, rename = "DefaultColumnWidth", prefix = "ss")] + default_column_width: f32, + #[yaserde(attribute, rename = "DefaultRowHeight", prefix = "ss")] + default_column_height: f32, + + #[yaserde(rename = "Row")] + rows: Vec, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +#[yaserde( + prefix = "ss", + namespace = "x: urn:schemas-microsoft-com:office:excel", + namespace = "ss: urn:schemas-microsoft-com:office:spreadsheet", + namespace = "o: urn:schemas-microsoft-com:office:office", + namespace = "html: http://www.w3.org/TR/REC-html40" +)] +struct Row { + #[yaserde(attribute, rename = "AutoFitHeight", prefix = "ss")] + auto_fit_height: f32, + #[yaserde(attribute, rename = "Height", prefix = "ss")] + height: f32, +} + +#[test] +fn parsing_bbigras_namespace() { + use std::fs; + use yaserde::de::from_str; + + let filename = "tests/data/bbigras-namespace.xml"; + + let content = fs::read_to_string(filename).expect("something went wrong reading the file"); + + let loaded: Workbook = from_str(&content).unwrap(); + println!("{:?}", loaded); + + let reference = Workbook { + worksheet: Worksheet { + ws_name: "some_name".to_string(), + table: Table { + expanded_column_count: 11, + expanded_row_count: 195, + full_columns: 1, + full_rows: 1, + style_id: "s64".to_string(), + default_column_width: 60.75, + default_column_height: 15.0, + rows: vec![Row { + auto_fit_height: 0.0, + height: 33.0, + }], + }, + }, + }; + + assert_eq!(loaded, reference); +} diff --git a/examples/src/boscop.rs b/examples/src/boscop.rs new file mode 100644 index 0000000..ff0d9cf --- /dev/null +++ b/examples/src/boscop.rs @@ -0,0 +1,118 @@ +// related to issue https://github.com/media-io/yaserde/issues/3 + +#[derive(Default, Debug, Clone, PartialEq, YaDeserialize)] +#[yaserde(root = "layout")] +pub struct Layout { + #[yaserde(attribute)] + pub version: u32, + #[yaserde(attribute)] + pub mode: u32, + #[yaserde(attribute)] + pub w: u32, + #[yaserde(attribute)] + pub h: u32, + #[yaserde(attribute)] + pub orientation: String, + pub tabpage: Vec, +} + +#[derive(Default, Debug, Clone, PartialEq, YaDeserialize)] +pub struct Tabpage { + #[yaserde(attribute, rename = "name")] + pub named: String, + #[yaserde(attribute)] + pub scalef: f32, + #[yaserde(attribute)] + pub scalet: f32, + #[yaserde(attribute)] + pub li_t: String, + #[yaserde(attribute)] + pub li_c: String, + #[yaserde(attribute)] + pub li_s: u32, + #[yaserde(attribute)] + pub li_o: bool, + #[yaserde(attribute)] + pub li_b: bool, + #[yaserde(attribute)] + pub la_t: String, + #[yaserde(attribute)] + pub la_c: String, + #[yaserde(attribute)] + pub la_s: u32, + #[yaserde(attribute)] + pub la_o: bool, + #[yaserde(attribute)] + pub la_b: bool, + pub control: Vec, +} + +#[derive(Default, Debug, Clone, PartialEq, YaDeserialize)] +pub struct Control { + #[yaserde(attribute, rename = "name")] + pub named: String, + #[yaserde(attribute)] + pub x: u32, + #[yaserde(attribute)] + pub y: u32, + #[yaserde(attribute)] + pub w: u32, + #[yaserde(attribute)] + pub h: u32, + #[yaserde(attribute)] + pub color: String, + #[yaserde(attribute)] + pub scalef: f32, + #[yaserde(attribute)] + pub scalet: f32, + #[yaserde(attribute)] + pub local_off: bool, + #[yaserde(attribute)] + pub sp: bool, + #[yaserde(attribute)] + pub sr: bool, + pub midi: Vec, + #[yaserde(attribute)] + pub response: String, + #[yaserde(attribute)] + pub inverted: String, + #[yaserde(attribute)] + pub centered: String, + #[yaserde(attribute)] + pub norollover: String, +} + +#[derive(Default, Debug, Clone, PartialEq, YaDeserialize)] +pub struct Midi { + #[yaserde(attribute)] + pub var: String, + #[yaserde(attribute, rename = "type")] + pub typ: String, + #[yaserde(attribute)] + pub channel: String, + #[yaserde(attribute)] + pub data1: String, + #[yaserde(attribute)] + pub data2f: String, + #[yaserde(attribute)] + pub data2t: String, + #[yaserde(attribute)] + pub sysex: String, +} + +#[test] +fn parsing_bbigras_namespace() { + use std::fs; + use yaserde::de::from_str; + + let filename = "tests/data/boscop.xml"; + let content = fs::read_to_string(filename).expect("something went wrong reading the file"); + + let loaded: Layout = from_str(&content).unwrap(); + + assert_eq!(loaded.tabpage.len(), 4); + assert_eq!(loaded.tabpage[0].control.len(), 13); + assert_eq!(loaded.tabpage[1].control.len(), 16); + assert_eq!(loaded.tabpage[2].control.len(), 65); + assert_eq!(loaded.tabpage[3].control.len(), 40); +} diff --git a/examples/src/lib.rs b/examples/src/lib.rs new file mode 100644 index 0000000..af42128 --- /dev/null +++ b/examples/src/lib.rs @@ -0,0 +1,7 @@ +#[macro_use] +extern crate yaserde_derive; + +mod bbigras_namespace; +mod boscop; +mod ln_dom; +mod svd; diff --git a/examples/src/ln_dom.rs b/examples/src/ln_dom.rs new file mode 100644 index 0000000..1264afa --- /dev/null +++ b/examples/src/ln_dom.rs @@ -0,0 +1,81 @@ +// related to issue https://github.com/media-io/yaserde/issues/11 + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +#[yaserde(root = "DOMSymbolItem")] +struct Level { + #[yaserde(attribute)] + last_modified: u64, + #[yaserde(attribute, rename = "name")] + named: String, + timeline: Timeline, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +struct Timeline { + #[yaserde(rename = "DOMTimeline")] + timeline: DOMTimeline, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +struct DOMTimeline { + #[yaserde(attribute, rename = "name")] + named: String, + #[yaserde(attribute)] + current_frame: u64, + #[yaserde(attribute)] + guides: u64, + layers: Layers, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +struct Layers { + #[yaserde(rename = "DOMLayer")] + dom_layer: Vec, +} + +#[derive(YaDeserialize, Default, Debug, PartialEq)] +struct DOMLayer { + #[yaserde(attribute, rename = "name")] + named: String, + #[yaserde(attribute)] + name2: String, +} + +#[test] +fn parsing_ln_dom() { + use std::fs; + use yaserde::de::from_str; + + let filename = "tests/data/ln-dom.xml"; + + let content = fs::read_to_string(filename).expect("something went wrong reading the file"); + + let loaded: Level = from_str(&content).unwrap(); + println!("{:?}", loaded); + + let reference = Level { + last_modified: 1414141442, + named: "dagger".to_string(), + timeline: Timeline { + timeline: DOMTimeline { + named: "dagger timeline name".to_string(), + current_frame: 7, + guides: 11, + layers: Layers { + dom_layer: vec![ + DOMLayer { + named: "Layer 2".to_string(), + name2: "Lalayer 2".to_string(), + }, + DOMLayer { + named: "Layer 1".to_string(), + name2: "Lalayer 1".to_string(), + }, + ], + }, + }, + }, + }; + + assert_eq!(loaded, reference); +} diff --git a/examples/src/svd.rs b/examples/src/svd.rs new file mode 100644 index 0000000..a4628a9 --- /dev/null +++ b/examples/src/svd.rs @@ -0,0 +1,196 @@ +use yaserde_derive::YaSerialize; + +#[derive(Default, PartialEq, Debug, YaSerialize)] +struct CpuDef { + #[yaserde(child)] + name: String, + #[yaserde(child)] + revision: String, + #[yaserde(child)] + endian: String, // enum {LE, BE, ME} + #[yaserde(child)] + mpupresent: bool, + #[yaserde(child)] + fpupresent: bool, + //#[yaserde(child)] + //nvicpriobits: enum {8, 16, 32, 64, 128}, + #[yaserde(child)] + vendorsystickconfig: bool, +} + +#[derive(Default, PartialEq, Debug, YaSerialize)] +struct Field { + name: String, + #[yaserde(child)] + description: String, + #[yaserde(child)] + bitrange: String, + #[yaserde(child)] + access: String, +} + +#[derive(Default, PartialEq, Debug, YaSerialize)] +struct Register { + #[yaserde(child)] + name: String, + #[yaserde(child)] + description: String, + #[yaserde(child)] + addressoffset: String, + #[yaserde(child)] + size: u8, + #[yaserde(child)] + access: String, + #[yaserde(child)] + resetvalue: String, + #[yaserde(child)] + resetmask: String, + #[yaserde(child)] + fields: Vec, +} + +#[derive(Default, PartialEq, Debug, YaSerialize)] +struct Peripheral { + #[yaserde(child)] + name: String, + #[yaserde(child)] + version: String, + #[yaserde(child)] + description: String, + #[yaserde(child)] + groupname: String, + #[yaserde(child)] + baseaddress: String, + #[yaserde(child)] + size: u8, + #[yaserde(child)] + access: String, + #[yaserde(child)] + registers: Vec, +} + +#[derive(Default, PartialEq, Debug, YaSerialize)] +struct DevAttrs { + #[yaserde(child)] + vendor: String, + #[yaserde(child)] + vendorid: String, + #[yaserde(child)] + name: String, + #[yaserde(child)] + series: String, + #[yaserde(child)] + version: String, + #[yaserde(child)] + description: String, + #[yaserde(child)] + licensetext: String, + #[yaserde(child)] + cpu: CpuDef, + #[yaserde(child)] + addressunitbits: u8, + #[yaserde(child)] + width: u8, + #[yaserde(child)] + size: u8, + #[yaserde(child)] + access: String, + #[yaserde(child)] + resetvalue: String, + #[yaserde(child)] + resetmask: String, + #[yaserde(child)] + peripherals: Vec, +} + +#[derive(Default, PartialEq, Debug, YaSerialize)] +#[yaserde(rename = "device")] +struct Device { + #[yaserde(attribute)] + schemaversion: String, + #[yaserde(attribute)] + xmlns: String, + #[yaserde(attribute)] + xsnonamespaceschemalocation: String, + #[yaserde(child)] + devattributes: DevAttrs, +} + +#[test] +fn parsing_svd() { + use std::fs; + + let register = Register { + name: "PRCMD".to_string(), + description: "This command register (PRCMD) is to protect the registers that may have a significant influence on the application system (PSC, PSM) from an inadvertent write access, so that the system does not stop in case of a program hang-up.".to_string(), + addressoffset: "0xFFFFF1FC".to_string(), + size: 8, + access: "read-write".to_string(), + resetvalue: "0x0000".to_string(), + resetmask: "0xFFFF".to_string(), + fields: vec![], + }; + + let vec_registers = vec![register]; + + let peripheral = Peripheral { + name: "Specific Registers".to_string(), + version: "1.0".to_string(), + description: "Specific Registers".to_string(), + groupname: "MCU".to_string(), + baseaddress: "0xFFFFF1FC".to_string(), + size: 16, + access: "read-write".to_string(), + registers: vec_registers, + }; + + let vec_peripherals = vec![peripheral]; + + let cpu_def = CpuDef { + name: "V850".to_string(), + revision: "r1".to_string(), + endian: "LE".to_string(), // enum {LE, BE, ME} + mpupresent: false, + fpupresent: false, + //nvicpriobits: enum {8, 16, 32, 64, 128}, + vendorsystickconfig: false, + }; + + let dev_attrs = DevAttrs { + vendor: "Renesas".to_string(), + vendorid: "Renesas".to_string(), + name: "V850".to_string(), + series: "E1/E2/CA2".to_string(), + version: "1.2".to_string(), + description: "NEC/Renesas V850 automotive grade ICs".to_string(), + licensetext: "GPLv3".to_string(), + cpu: cpu_def, + addressunitbits: 8, + width: 32, + size: 32, + access: "read-write".to_string(), + resetvalue: "0x00000000".to_string(), + resetmask: "0xFFFFFFFF".to_string(), + peripherals: vec_peripherals, + }; + + let device = Device { + schemaversion: "foo".to_string(), + xmlns: "http://www.w3.org/2001/XMLSchema-instance".to_string(), + xsnonamespaceschemalocation: "CMSIS-SVD.xsd".to_string(), + devattributes: dev_attrs, + }; + + // Display pretty printed XML + let yaserde_cfg = yaserde::ser::Config { + perform_indent: true, + ..Default::default() + }; + + let serialized = yaserde::ser::to_string_with_config(&device, &yaserde_cfg).unwrap(); + + let reference = + fs::read_to_string("tests/data/svd.xml").expect("something went wrong reading the file"); + + assert_eq!(reference, serialized) +} diff --git a/examples/tests/data/bbigras-namespace.xml b/examples/tests/data/bbigras-namespace.xml new file mode 100644 index 0000000..209b3b2 --- /dev/null +++ b/examples/tests/data/bbigras-namespace.xml @@ -0,0 +1,9 @@ + + + + + + +
+
+
diff --git a/examples/tests/data/boscop.xml b/examples/tests/data/boscop.xml new file mode 100644 index 0000000..96e6f58 --- /dev/null +++ b/examples/tests/data/boscop.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/tests/data/ln-dom.xml b/examples/tests/data/ln-dom.xml new file mode 100644 index 0000000..81d14d8 --- /dev/null +++ b/examples/tests/data/ln-dom.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/examples/tests/data/svd.xml b/examples/tests/data/svd.xml new file mode 100644 index 0000000..8743645 --- /dev/null +++ b/examples/tests/data/svd.xml @@ -0,0 +1,44 @@ + + + + Renesas + Renesas + V850 + E1/E2/CA2 + 1.2 + NEC/Renesas V850 automotive grade ICs + GPLv3 + + V850 + r1 + LE + false + false + false + + 8 + 32 + 32 + read-write + 0x00000000 + 0xFFFFFFFF + + Specific Registers + 1.0 + Specific Registers + MCU + 0xFFFFF1FC + 16 + read-write + + PRCMD + This command register (PRCMD) is to protect the registers that may have a significant influence on the application system (PSC, PSM) from an inadvertent write access, so that the system does not stop in case of a program hang-up. + 0xFFFFF1FC + 8 + read-write + 0x0000 + 0xFFFF + + + + \ No newline at end of file diff --git a/yaserde/src/lib.rs b/yaserde/src/lib.rs index 5adce88..9aaafce 100644 --- a/yaserde/src/lib.rs +++ b/yaserde/src/lib.rs @@ -2,6 +2,84 @@ //! //! YaSerDe is a framework for ***ser***ializing and ***de***serializing Rust data //! structures efficiently and generically from and into XML. +//! +//! YaSerDe makes it easy to serialize XML documents given an properly annotated struct. +//! Please refer to the `examples` directory for the complete code shown below. +//! +//! # Serialize +//! +//! For instance, let's say that one wants to generate a XML file for the +//! [Rust-Embedded community](https://github.com/rust-embedded/). A well known XML +//! file for microcontrollers is called [SVD](https://github.com/rust-embedded/svd/) +//! and it can be defined on YaSerDe via structs like so: +//! +//!```rust +//! use yaserde_derive::YaSerialize; +//! +//! #[derive(Default, PartialEq, Debug, YaSerialize)] +//! #[yaserde(rename = "device")] +//! struct Device { +//! #[yaserde(attribute)] +//! schemaversion: String, +//! #[yaserde(attribute)] +//! xmlns: String, +//! #[yaserde(attribute)] +//! xsnonamespaceschemalocation: String, +//! #[yaserde(child)] +//! attributes: DeviceAttributes +//! } +//! +//! #[derive(Default, PartialEq, Debug, YaSerialize)] +//! struct DeviceAttributes { +//! #[yaserde(child)] +//! vendor: String, +//! } +//!``` +//! +//! The interspersed `#[yaserde()]` macros give some indication of what the resulting XML +//! Will look like, namely, a short snippet of the struct above in XML would be depending on +//! concrete values passed to the struct (not shown): +//! +//!```xml +//! (...) +//! +//! +//! +//! (...) +//!``` +//! +//! Notice the important difference in **XML output representation between `attributes` vs +//! `child`**, since SVD expects information in that particular arrangement. YaSerDe allows that +//! serialized XML to be valid unlike other Rust XML (de)serialization crates (i.e quick-xml). +//! +//! Also the last `DevAttrs` struct field is indeed another struct, so one can chain several +//! structs to compose the XML structure (again, see examples folder for the complete +//! example). +//! +//! Be mindful that the **Cargo.toml** should not only include `yaserde` and +//! `yaserde_derive`, but also a few necessary dependencies... [FIXME: THAT FOR SOME +//! USER-UNFRIENDLY REASON ARE NOT AUTOMATICALLY PULLED IN AS ONE WOULD EXPECT ;P ;P +//! ... I'm sure there are good reasons, just wanted to leave this like this so that the author +//! can chip in and comment about the reasons behind that decision.](https://github.com/media-io/yaserde/issues/22) ... **I personally think that issue #22 should be reopened and fixed properly (as in only requiring yaserde as a dependency, adding yaserde_derive as a feature).** +//! +//!```toml +//! [dependencies] +//! # serde = { version = "1.0.123", features = [ "derive" ] } +//! # quick-xml = { version = "0.21.0", features = [ "serialize" ] } +//! yaserde = "0.5.1" +//! yaserde_derive = "0.5.1" +//! xml-rs = "0.8.3" +//! log = "0.4" +//! ``` +//! +//! Last but not least, in order to have a nice, pretty printed XML output one can do +//! +//! ```shell +//! PLEASE LET THE USERS KNOW HOW TO DO THAT CLEARLY ON YASERDE??? +//! ``` +//! +//! FIXME: For now I'm just resorting to online XML linters and formatters :_S #[macro_use] extern crate log; diff --git a/yaserde/tests/option.rs b/yaserde/tests/option.rs index 32bf492..fe59cb0 100644 --- a/yaserde/tests/option.rs +++ b/yaserde/tests/option.rs @@ -15,29 +15,29 @@ fn basic_option_types() { test_for_type!(Option::, None, None); test_for_type!(Option::, Some(true), Some("true")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as u8), Some("12")); + test_for_type!(Option::, Some(12_u8), Some("12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as i8), Some("12")); - test_for_type!(Option::, Some(-12 as i8), Some("-12")); + test_for_type!(Option::, Some(12_i8), Some("12")); + test_for_type!(Option::, Some(-12_i8), Some("-12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as u16), Some("12")); + test_for_type!(Option::, Some(12_u16), Some("12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as i16), Some("12")); - test_for_type!(Option::, Some(-12 as i16), Some("-12")); + test_for_type!(Option::, Some(12_i16), Some("12")); + test_for_type!(Option::, Some(-12_i16), Some("-12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as u32), Some("12")); + test_for_type!(Option::, Some(12_u32), Some("12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as i32), Some("12")); - test_for_type!(Option::, Some(-12 as i32), Some("-12")); + test_for_type!(Option::, Some(12_i32), Some("12")); + test_for_type!(Option::, Some(-12_i32), Some("-12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as u64), Some("12")); + test_for_type!(Option::, Some(12_u64), Some("12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(12 as i64), Some("12")); - test_for_type!(Option::, Some(-12 as i64), Some("-12")); + test_for_type!(Option::, Some(12_i64), Some("12")); + test_for_type!(Option::, Some(-12_i64), Some("-12")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(-12.5 as f32), Some("-12.5")); + test_for_type!(Option::, Some(-12.5_f32), Some("-12.5")); test_for_type!(Option::, None, None); - test_for_type!(Option::, Some(-12.5 as f64), Some("-12.5")); + test_for_type!(Option::, Some(-12.5_f64), Some("-12.5")); test_for_type!(Option::, None, None); // TODO @@ -50,29 +50,29 @@ fn basic_option_types() { test_for_attribute_type!(Option::, None, None); test_for_attribute_type!(Option::, Some(true), Some("true")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as u8), Some("12")); + test_for_attribute_type!(Option::, Some(12_u8), Some("12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as i8), Some("12")); - test_for_attribute_type!(Option::, Some(-12 as i8), Some("-12")); + test_for_attribute_type!(Option::, Some(12_i8), Some("12")); + test_for_attribute_type!(Option::, Some(-12_i8), Some("-12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as u16), Some("12")); + test_for_attribute_type!(Option::, Some(12_u16), Some("12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as i16), Some("12")); - test_for_attribute_type!(Option::, Some(-12 as i16), Some("-12")); + test_for_attribute_type!(Option::, Some(12_i16), Some("12")); + test_for_attribute_type!(Option::, Some(-12_i16), Some("-12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as u32), Some("12")); + test_for_attribute_type!(Option::, Some(12_u32), Some("12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as i32), Some("12")); - test_for_attribute_type!(Option::, Some(-12 as i32), Some("-12")); + test_for_attribute_type!(Option::, Some(12_i32), Some("12")); + test_for_attribute_type!(Option::, Some(-12_i32), Some("-12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as u64), Some("12")); + test_for_attribute_type!(Option::, Some(12_u64), Some("12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(12 as i64), Some("12")); - test_for_attribute_type!(Option::, Some(-12 as i64), Some("-12")); + test_for_attribute_type!(Option::, Some(12_i64), Some("12")); + test_for_attribute_type!(Option::, Some(-12_i64), Some("-12")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(-12.5 as f32), Some("-12.5")); + test_for_attribute_type!(Option::, Some(-12.5_f32), Some("-12.5")); test_for_attribute_type!(Option::, None, None); - test_for_attribute_type!(Option::, Some(-12.5 as f64), Some("-12.5")); + test_for_attribute_type!(Option::, Some(-12.5_f64), Some("-12.5")); test_for_attribute_type!(Option::, None, None); } diff --git a/yaserde/tests/skip_if.rs b/yaserde/tests/skip_if.rs index 641e737..de62a7d 100644 --- a/yaserde/tests/skip_if.rs +++ b/yaserde/tests/skip_if.rs @@ -34,7 +34,7 @@ fn skip_serializing_if_for_struct() { } impl XmlStruct { - fn check_string_function(&self, value: &String) -> bool { + fn check_string_function(&self, value: &str) -> bool { value == "something" } @@ -47,7 +47,7 @@ fn skip_serializing_if_for_struct() { } fn check_f32_function(&self, value: &f32) -> bool { - value == &0.0 + (value - 0.0).abs() < f32::EPSILON } } diff --git a/yaserde/tests/types.rs b/yaserde/tests/types.rs index 3b2ec70..db5c82d 100644 --- a/yaserde/tests/types.rs +++ b/yaserde/tests/types.rs @@ -13,37 +13,37 @@ fn ser_type() { test_for_type!(String, "test".to_string(), Some("test")); test_for_type!(bool, true, Some("true")); - test_for_type!(u8, 12 as u8, Some("12")); - test_for_type!(i8, 12 as i8, Some("12")); - test_for_type!(i8, -12 as i8, Some("-12")); - test_for_type!(u16, 12 as u16, Some("12")); - test_for_type!(i16, 12 as i16, Some("12")); - test_for_type!(i16, -12 as i16, Some("-12")); - test_for_type!(u32, 12 as u32, Some("12")); - test_for_type!(i32, 12 as i32, Some("12")); - test_for_type!(i32, -12 as i32, Some("-12")); - test_for_type!(u64, 12 as u64, Some("12")); - test_for_type!(i64, 12 as i64, Some("12")); - test_for_type!(i64, -12 as i64, Some("-12")); - test_for_type!(f32, -12.5 as f32, Some("-12.5")); - test_for_type!(f64, -12.5 as f64, Some("-12.5")); + test_for_type!(u8, 12_u8, Some("12")); + test_for_type!(i8, 12_i8, Some("12")); + test_for_type!(i8, -12_i8, Some("-12")); + test_for_type!(u16, 12_u16, Some("12")); + test_for_type!(i16, 12_i16, Some("12")); + test_for_type!(i16, -12_i16, Some("-12")); + test_for_type!(u32, 12_u32, Some("12")); + test_for_type!(i32, 12_i32, Some("12")); + test_for_type!(i32, -12_i32, Some("-12")); + test_for_type!(u64, 12_u64, Some("12")); + test_for_type!(i64, 12_i64, Some("12")); + test_for_type!(i64, -12_i64, Some("-12")); + test_for_type!(f32, -12.5_f32, Some("-12.5")); + test_for_type!(f64, -12.5_f64, Some("-12.5")); test_for_type!(Vec::, vec![], None); test_for_type!(Vec::, vec!["test".to_string()], Some("test")); test_for_attribute_type!(String, "test".to_string(), Some("test")); test_for_attribute_type!(bool, true, Some("true")); - test_for_attribute_type!(u8, 12 as u8, Some("12")); - test_for_attribute_type!(i8, 12 as i8, Some("12")); - test_for_attribute_type!(i8, -12 as i8, Some("-12")); - test_for_attribute_type!(u16, 12 as u16, Some("12")); - test_for_attribute_type!(i16, 12 as i16, Some("12")); - test_for_attribute_type!(i16, -12 as i16, Some("-12")); - test_for_attribute_type!(u32, 12 as u32, Some("12")); - test_for_attribute_type!(i32, 12 as i32, Some("12")); - test_for_attribute_type!(i32, -12 as i32, Some("-12")); - test_for_attribute_type!(u64, 12 as u64, Some("12")); - test_for_attribute_type!(i64, 12 as i64, Some("12")); - test_for_attribute_type!(i64, -12 as i64, Some("-12")); - test_for_attribute_type!(f32, -12.5 as f32, Some("-12.5")); - test_for_attribute_type!(f64, -12.5 as f64, Some("-12.5")); + test_for_attribute_type!(u8, 12_u8, Some("12")); + test_for_attribute_type!(i8, 12_i8, Some("12")); + test_for_attribute_type!(i8, -12_i8, Some("-12")); + test_for_attribute_type!(u16, 12_u16, Some("12")); + test_for_attribute_type!(i16, 12_i16, Some("12")); + test_for_attribute_type!(i16, -12_i16, Some("-12")); + test_for_attribute_type!(u32, 12_u32, Some("12")); + test_for_attribute_type!(i32, 12_i32, Some("12")); + test_for_attribute_type!(i32, -12_i32, Some("-12")); + test_for_attribute_type!(u64, 12_u64, Some("12")); + test_for_attribute_type!(i64, 12_i64, Some("12")); + test_for_attribute_type!(i64, -12_i64, Some("-12")); + test_for_attribute_type!(f32, -12.5_f32, Some("-12.5")); + test_for_attribute_type!(f64, -12.5_f64, Some("-12.5")); }