From 2e75ffea6854e367f26994ff051eaf3d69c673ab Mon Sep 17 00:00:00 2001 From: Zykino Date: Tue, 20 Sep 2022 23:03:15 +0200 Subject: [PATCH] Add JSON5 deserialization --- Cargo.lock | 153 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + examples/shortExample.json5 | 12 +++ src/lib.rs | 12 +++ tests/integration.rs | 20 +++++ 5 files changed, 198 insertions(+) create mode 100644 examples/shortExample.json5 diff --git a/Cargo.lock b/Cargo.lock index 6ded61d..8a08eef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,12 +31,27 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "clap" version = "3.2.20" @@ -76,6 +91,45 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -119,6 +173,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "libc" version = "0.2.132" @@ -167,6 +232,50 @@ version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" +[[package]] +name = "pest" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb779fcf4bb850fbbb0edc96ff6cf34fd90c4b1a112ce042653280d9a7364048" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502b62a6d0245378b04ffe0a7fb4f4419a4815fce813bd8a0ec89a56e07d67b1" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451e629bf49b750254da26132f1a5a9d11fd8a95a3df51d15c4abd1ba154cb6c" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec162c71c45e269dfc3fc2916eaeb97feab22993a21bcce4721d08cd7801a6" +dependencies = [ + "once_cell", + "pest", + "sha1", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -292,6 +401,17 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "strsim" version = "0.10.0" @@ -324,11 +444,32 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" +[[package]] +name = "thiserror" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53f98874615aea268107765aa1ed8f6116782501d18e53d08b471733bea6c85" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b463991b4eab2d801e724172285ec4195c650e8ec79b149e6c2a8e6dd3f783" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tradaf" version = "0.1.0" dependencies = [ "clap", + "json5", "ron", "serde", "serde-pickle", @@ -337,6 +478,18 @@ dependencies = [ "serde_yaml", ] +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + [[package]] name = "unicode-ident" version = "1.0.3" diff --git a/Cargo.toml b/Cargo.toml index 17618cc..ecfecaf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ serde-transcode = "1.1.1" #bson = "2.3" #ciborium = "0.2" serde_json = "1.0" +json5 = "0.4" serde-pickle = "1.0" ron = "0.8" #toml = "0.5" diff --git a/examples/shortExample.json5 b/examples/shortExample.json5 new file mode 100644 index 0000000..0e72c64 --- /dev/null +++ b/examples/shortExample.json5 @@ -0,0 +1,12 @@ +{ + // comments + unquoted: 'and you can quote me on that', + singleQuotes: 'I can use "double quotes" here', + lineBreaks: "Look, Mom! \ +No \\n's!", + hexadecimal: 0xdecaf, + leadingDecimalPoint: .8675309, andTrailing: 8675309., + positiveSign: +1, + trailingComma: 'in objects', andIn: ['arrays',], + "backwardsCompatible": "with JSON", +} diff --git a/src/lib.rs b/src/lib.rs index 2016e5a..4eef973 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub enum Input { //Bson, //Cbor, Json, + Json5, Pickle, Ron, //Toml @@ -37,6 +38,7 @@ pub enum Output { //Bson, //Cbor, Json, + //Json5, // NOTE: The crate is not notted "(deserialization only)" on the [serde listing](https://serde.rs/#data-formats) but it does not expose a serializer Pickle, Ron, //Toml, @@ -77,6 +79,16 @@ fn de(opt: &Opt, input: &mut dyn Read, output: &mut dyn Write) { let mut deserializer = Deserializer::from_reader(input); ser(opt, &mut deserializer, output); } + Input::Json5 => { + use json5::Deserializer; + + // NOTE: Apparently Json5 do not implement `Deserializer` on const? + // NOTE: Apparently Json5 do not implement `Deserializer::from_reader` but it can serialise into a writter… + let mut buf = String::new(); + let _buf_size = input.read_to_string(&mut buf).unwrap(); + let mut deserializer = Deserializer::from_str(&buf).unwrap(); + ser(opt, &mut deserializer, output); + } Input::Pickle => { use serde_pickle::Deserializer; diff --git a/tests/integration.rs b/tests/integration.rs index a66359d..12cbc43 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -34,3 +34,23 @@ fn ron_to_json() { assert_eq!(control, out); } + +#[test] +fn json5_read_json() { + let opt = Opt { + input: Input::Json5, + output: Output::Json, + pretty: true, + no_newline: false, + }; + + let input = example_to_vec("examples/materials.json"); + + let mut output = vec![]; + transcode(opt, &mut input.as_slice(), &mut output); + let out = String::from_utf8(output).unwrap(); + + let control = example_to_string("examples/materials.json"); + + assert_eq!(control, out); +}