Add JSON5 deserialization
This commit is contained in:
		
							
								
								
									
										153
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										153
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -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"
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								examples/shortExample.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/shortExample.json5
									
									
									
									
									
										Normal file
									
								
							@@ -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",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user