13 Commits

Author SHA1 Message Date
b9bffdc19c Bump version to 0.1.1
Changelog:
  * Move the examples data files
  * Implement a first pass on every data format listed on serde.rs
2022-12-04 14:42:25 +01:00
9f5cbd7d07 Fix tests 2022-12-04 14:24:26 +01:00
971a19a6e0 Add Bencode Deserialization 2022-12-04 14:24:05 +01:00
91d5fc666f Attempt to add FlexBuffers format 2022-10-29 20:33:38 +02:00
f5b2a25eaf Add GVariant with the same (very low) hope to trully make it work as DBus 2022-10-27 00:22:37 +02:00
ceb10fabd9 Rename folder containing data foramt samples 2022-10-27 00:02:27 +02:00
7c7ab52379 Update README 2022-10-26 23:56:41 +02:00
75ca5735a8 Tagging script should run the test and force formatting => dirty repo will prevent the tagging 2022-10-26 23:54:46 +02:00
6a4fbe3098 Attempt to add DBus, it compiles but I did not achive a conversion (in either direction) 2022-10-26 23:53:37 +02:00
20022a54e8 Try to add S-Expressions (LISP family) 2022-09-25 22:47:52 +02:00
f17e13fe25 Add Message Pack serialization 2022-09-21 00:42:58 +02:00
d13a167ac8 Add URL QueryString serialization 2022-09-20 23:23:58 +02:00
2e75ffea68 Add JSON5 deserialization 2022-09-20 23:03:15 +02:00
13 changed files with 695 additions and 13 deletions

390
Cargo.lock generated
View File

@ -2,6 +2,21 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "addr2line"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "atty"
version = "0.2.14"
@ -19,24 +34,71 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "backtrace"
version = "0.3.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "base64"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "bendy"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8133e404c8bec821e531f347dab1247bf64f60882826e7228f8ffeb33a35a658"
dependencies = [
"failure",
"serde",
"serde_bytes",
]
[[package]]
name = "bitflags"
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 = "cc"
version = "1.0.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574"
[[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 +138,73 @@ 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 = "failure"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
dependencies = [
"backtrace",
"failure_derive",
]
[[package]]
name = "failure_derive"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[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 = "gimli"
version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
[[package]]
name = "hashbrown"
version = "0.12.3"
@ -119,12 +248,38 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "miniz_oxide"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34"
dependencies = [
"adler",
]
[[package]]
name = "num-bigint"
version = "0.4.3"
@ -155,6 +310,15 @@ dependencies = [
"autocfg",
]
[[package]]
name = "object"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.14.0"
@ -167,6 +331,73 @@ version = "6.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
[[package]]
name = "paste"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
[[package]]
name = "percent-encoding"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[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-crate"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9"
dependencies = [
"once_cell",
"thiserror",
"toml",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
@ -209,6 +440,28 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rmp"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f"
dependencies = [
"byteorder",
"num-traits",
"paste",
]
[[package]]
name = "rmp-serde"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25786b0d276110195fa3d6f3f31299900cf71dfbd6c28450f3f58a0e7f7a347e"
dependencies = [
"byteorder",
"rmp",
"serde",
]
[[package]]
name = "ron"
version = "0.8.0"
@ -220,6 +473,12 @@ dependencies = [
"serde",
]
[[package]]
name = "rustc-demangle"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]]
name = "ryu"
version = "1.0.11"
@ -257,6 +516,15 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_bytes"
version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b"
dependencies = [
"serde",
]
[[package]]
name = "serde_derive"
version = "1.0.144"
@ -279,6 +547,17 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_qs"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cac3f1e2ca2fe333923a1ae72caca910b98ed0630bb35ef6f8c8517d6e81afa"
dependencies = [
"percent-encoding",
"serde",
"thiserror",
]
[[package]]
name = "serde_yaml"
version = "0.9.11"
@ -292,6 +571,23 @@ 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 = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
version = "0.10.0"
@ -309,6 +605,18 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "synstructure"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
"proc-macro2",
"quote",
"syn",
"unicode-xid",
]
[[package]]
name = "termcolor"
version = "1.1.3"
@ -325,24 +633,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
[[package]]
name = "tradaf"
version = "0.1.0"
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 = "toml"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
dependencies = [
"serde",
]
[[package]]
name = "tradaf"
version = "0.1.1"
dependencies = [
"bendy",
"byteorder",
"clap",
"json5",
"rmp-serde",
"ron",
"serde",
"serde-pickle",
"serde-transcode",
"serde_json",
"serde_qs",
"serde_yaml",
"zvariant",
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "unsafe-libyaml"
version = "0.2.2"
@ -385,3 +746,28 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "zvariant"
version = "3.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bd68e4e6432ef19df47d7e90e2e72b5e7e3d778e0ae3baddf12b951265cc758"
dependencies = [
"byteorder",
"libc",
"serde",
"static_assertions",
"zvariant_derive",
]
[[package]]
name = "zvariant_derive"
version = "3.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08e977eaa3af652f63d479ce50d924254ad76722a6289ec1a1eac3231ca30430"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn",
]

View File

@ -1,6 +1,6 @@
[package]
name = "tradaf"
version = "0.1.0"
version = "0.1.1"
authors = ["Zykino <Zykino@users.noreply.github.com>"]
description = "Tranduit Data Format: Translate serialized data from one format to another."
license = "GPL-3.0-or-later"
@ -16,18 +16,30 @@ edition = "2021"
[dependencies]
# TODO: handle errors (or pass them to main) instead of unwrapping
#anyhow = "1.0.64"
clap = { version = "3.2.20", features = ["derive"] }
clap = { version = "3.2", features = ["derive"] }
# TODO: May be used to "deserialize any" if I understood correctly. (Or maybe `typetag`?) But I did not achieved to make it work with serde-transcode
#erased-serde = "0.3.23"
serde = "1.0"
serde-transcode = "1.1.1"
serde-transcode = "1.1"
# Data types we support
# Should tend to be equal to the official list of data formats supported by serde: https://serde.rs/#data-formats
bendy = { version = "0.3", features = ["std", "serde"] }
#bson = "2.3"
#ciborium = "0.2"
#serde_dynamo = "4.0" # `Serializer` and `Deserializer` exposed does not provieded required API.
#envy = "0.4" # No `Deserializer` exposed.
#envy-store = "0.1" # No `Deserializer` exposed.
#flexbuffers = "2.0" # `Serializer` and `Deserializer` exposed does not provieded required API.
#deser-hjson = "1.0" # No `Deserializer` exposed.
serde_json = "1.0"
json5 = "0.4"
#serde-lexpr = "0.1"
serde-pickle = "1.0"
serde_qs = "0.10"
rmp-serde = "1.1"
ron = "0.8"
#toml = "0.5"
serde_yaml = "0.9"
zvariant = "3.6" # D-Bus & GVariant # TODO: try to implement it with the from signature?
byteorder = "1.3" # required by zvariant

View File

@ -22,3 +22,42 @@ Transcode into JSON so we can use `jq`, do some transformations and then transco
```sh
tradaf RON json < examples/gameConfig.ron | jq .key_bindings | tradaf Json yaml
```
# TODOS
* [ ] Implement all [data formats](https://serde.rs/#data-formats), or at least the one that expose a serde serializer or deserializer.
* [-] Bencode
* [X] Deserialization
* [ ] Serialization
* [ ] BSON
* [ ] CBOR
* [-] DBus (not sure it is working, but it compile…)
* [ ] DynamoDB
* [ ] Envy (deserialization only)
* [ ] Envy store (deserialization only)
* [ ] FlexBuffer
* The `Serializer` and `Deserializer` exposed does not work with serde-transcode.
* [-] GVariant => See DBus: the same crate propose both
* [ ] HJSON
* [X] JSON
* [-] JSON5
* [X] Deserialization
* [ ] Serialization
* [ ] https://github.com/Lucretiel/kaydle
* [ ] S-Expressions (lisp)
* [X] Pickle
* [ ] Test properly both way
* [-] Query String (URL)
* [ ] Deserialization
* [X] Serialization
* [-] MessagePack
* [ ] Deserialization
* [X] Serialization
* [X] RON
* [ ] TOML
* [X] YAML
* [ ]
* [ ] Add tests for each serializer and each deserializer (at least one)
* [ ] Check if crates have features that we should enable/disable
* [ ] `zvariant` looks to include async runtime by default
* [ ] Check my notes for each data format and open an issue on the crates to point problem/present my project and ask for help
* [ ] Add proper error handling (find a mentor to explain me propper error management: struct, enum, … and then use anyhow/this_error if needed)

View File

@ -3,6 +3,12 @@
CURRENT_VERSION=$(grep -E "^version\s?=" Cargo.toml | cut --delimiter='"' --fields=2)
TAG="v$CURRENT_VERSION"
cargo fmt
if ! cargo test; then
exit $?
fi
if cargo publish --dry-run; then
echo "Creating tag: $TAG"
echo "Do not forget to push it: git push origin $TAG"

View File

@ -1,6 +1,9 @@
use clap::{Parser, ValueEnum};
use serde::de::Deserializer;
use std::io::{Read, Write};
use std::{
convert::TryFrom,
io::{Read, Write},
};
#[derive(Debug, Parser)]
#[clap(author, version, about, long_about = None)]
@ -12,6 +15,11 @@ pub struct Opt {
#[clap(value_enum, ignore_case = true)]
pub output: Output,
#[clap(long, short = 'F', required_if_eq_any(&[("input", "d-bus"), ("input", "g-variant")]))]
pub format_in: Option<String>,
#[clap(long, short = 'f', required_if_eq_any(&[("output", "d-bus"), ("output", "g-variant")]))]
pub format_out: Option<String>,
/// For data format compatible, a default pretty format is output instead of a minified one
/// Output a pretty formated data instead of minified, only for format compatible
#[clap(long, short)]
@ -23,10 +31,19 @@ pub struct Opt {
#[derive(Copy, Clone, Debug, ValueEnum)]
pub enum Input {
Bencode,
//Bson,
//Cbor,
DBus,
//DynamoDB,
//FlexBuffer,
GVariant,
Json,
Json5,
//SExpression,
Pickle,
//Qs, // NOTE: The crate is not noted "(serialization only)" on the [serde listing](https://serde.rs/#data-formats) but it does not expose a `Deserializer`
//Rmp, // NOTE: It appears that we are forced to deserialize into a concrete type
Ron,
//Toml
Yaml,
@ -34,18 +51,25 @@ pub enum Input {
#[derive(Copy, Clone, Debug, ValueEnum)]
pub enum Output {
//Bencode,
//Bson,
//Cbor,
DBus,
//DynamoDB,
//FlexBuffer,
GVariant,
Json,
//Json5, // NOTE: The crate is not noted "(deserialization only)" on the [serde listing](https://serde.rs/#data-formats) but it does not expose a `Serializer`
//SExpression,
Pickle,
Qs,
Rmp,
Ron,
//Toml,
Yaml,
}
pub fn transcode(opt: Opt, input: &mut dyn Read, output: &mut dyn Write) {
// A JSON deserializer. You can use any Serde Deserializer here.
de(&opt, input, output);
// TODO: I would love to be able to have `de` and `ser` return the correct
@ -62,14 +86,74 @@ pub fn transcode(opt: Opt, input: &mut dyn Read, output: &mut dyn Write) {
fn de(opt: &Opt, input: &mut dyn Read, output: &mut dyn Write) {
match opt.input {
Input::Bencode => {
use bendy::serde::Deserializer;
let mut buf = vec![];
let _buf_size = input.read_to_end(&mut buf).unwrap();
let mut deserializer = Deserializer::from_bytes(&buf);
ser(opt, &mut deserializer, output);
}
/*
Input::Bson => {
use bson::Deserializer;
let mut deserializer = bson::from_reader(input).unwrap(); // FIXME: need which type annotation?
ser(opt, &mut deserializer, output);
let deserializer = bson::from_reader(input).unwrap(); // FIXME: can we skip the type annotation?
ser(opt, deserializer, output);
}
*/
Input::DBus => {
use zvariant::dbus::Deserializer;
use zvariant::EncodingContext;
use zvariant::Signature;
use byteorder::LE;
let sig = opt.format_in.clone().unwrap();
let mut buf = String::new();
let _buf_size = input.read_to_string(&mut buf).unwrap();
let mut deserializer = Deserializer::new(
buf.as_bytes(),
None,
&Signature::try_from(sig).unwrap(),
EncodingContext::<LE>::new_dbus(0),
);
ser(opt, &mut deserializer, output);
}
/*
Input::DynamoDB => {
use serde_dynamo::Deserializer;
let deserializer = Deserializer::from(input); // from_reader(input);
ser(opt, deserializer, output);
}
*/
/*
Input::FlexBuffer => {
use serde_yaml::Deserializer;
let deserializer = Deserializer::from_reader(input);
ser(opt, deserializer, output);
}
*/
Input::GVariant => {
use zvariant::gvariant::Deserializer;
use zvariant::EncodingContext;
use zvariant::Signature;
use byteorder::LE;
let sig = opt.format_in.clone().unwrap();
let mut buf = String::new();
let _buf_size = input.read_to_string(&mut buf).unwrap();
let mut deserializer = Deserializer::new(
buf.as_bytes(),
None,
&Signature::try_from(sig).unwrap(),
EncodingContext::<LE>::new_dbus(0),
);
ser(opt, &mut deserializer, output);
}
Input::Json => {
use serde_json::Deserializer;
@ -77,6 +161,24 @@ 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::SExpression => {
use serde_lexpr as Deserializer;
let deserializer = Deserializer::from_reader(input).unwrap(); // FIXME: can we skip the type annotation?
ser(opt, deserializer, output);
}
*/
Input::Pickle => {
use serde_pickle::Deserializer;
@ -108,6 +210,16 @@ where
D: Deserializer<'de>,
{
match opt.output {
/*
Output::Bencode => {
use bendy::serde::Serializer;
let serializer = &mut Serializer::new(/*output*/);
serde_transcode::transcode(deserializer, serializer).unwrap();
serializer.into_bytes();
}
*/
/*
Output::Bson => {
use bson::Serializer;
@ -119,10 +231,74 @@ where
options.human_readable(false)
};
let serializer = Serializer::new_with_options(options.build()); // FIXME: why no way to tell the serializer were we want the output?
let serializer = Serializer::new_with_options(options.build()); // FIXME: why no way to tell the serializer were we want the output?
serde_transcode::transcode(deserializer, serializer).unwrap();
}
*/
Output::DBus => {
use zvariant::dbus::Serializer;
use zvariant::EncodingContext;
use zvariant::Signature;
use byteorder::LE;
let sig = opt.format_out.clone().unwrap();
let mut out = std::io::Cursor::new(vec![]);
let mut fs = vec![];
let serializer = &mut Serializer::new(
&Signature::try_from(sig).unwrap(),
&mut out,
&mut fs, //None,
EncodingContext::<LE>::new_dbus(0),
);
//let mut buf = String::new();
// let _buf_size = output.read_to_string(&mut buf).unwrap();
// let mut deserializer = Deserializer::new();
serde_transcode::transcode(deserializer, serializer).unwrap();
}
/*
Output::DynamoDB => {
use serde_dynamo::Serializer;
let serializer = &mut Serializer::new(output);
serde_transcode::transcode(deserializer, serializer).unwrap();
}
*/
/*
Output::FlexBuffer => {
use flexbuffers::FlexbufferSerializer as Serializer;
let serializer = &mut Serializer::new(/*output*/);
// serde_transcode::transcode(deserializer, serializer).unwrap();
let r = flexbuffers::Reader::get_root(serializer.view()).unwrap();
println!("{}", r);
}
*/
Output::GVariant => {
use zvariant::gvariant::Serializer;
use zvariant::EncodingContext;
use zvariant::Signature;
use byteorder::LE;
let sig = opt.format_out.clone().unwrap();
let mut out = std::io::Cursor::new(vec![]);
let mut fs = vec![];
let serializer = &mut Serializer::new(
&Signature::try_from(sig).unwrap(),
&mut out,
&mut fs, //None,
EncodingContext::<LE>::new_dbus(0),
);
//let mut buf = String::new();
// let _buf_size = output.read_to_string(&mut buf).unwrap();
// let mut deserializer = Deserializer::new();
serde_transcode::transcode(deserializer, serializer).unwrap();
}
Output::Json => {
use serde_json::Serializer;
@ -140,6 +316,14 @@ where
// NOTE: serde_jsons PrettyFormatter and CompactFormatter are incompatibles…
// serde_transcode::transcode(deserializer, serializer).unwrap();
}
/*
Output::SExpression => {
use serde_lexpr::to_writer as Serializer;
let serializer = Serializer::new(output); // FIXME: There is a `to_writer` but the Serializer is not exposed directly.
serde_transcode::transcode(deserializer, serializer).unwrap();
}
*/
Output::Pickle => {
use serde_pickle::Serializer;
@ -147,6 +331,20 @@ where
serde_transcode::transcode(deserializer, serializer).unwrap();
}
Output::Qs => {
use serde_qs::Serializer;
let serializer = &mut Serializer::new(output);
serde_transcode::transcode(deserializer, serializer).unwrap();
}
Output::Rmp => {
use rmp_serde::Serializer;
let serializer = &mut Serializer::new(output);
serde_transcode::transcode(deserializer, serializer).unwrap();
}
Output::Ron => {
use ron::Serializer;

1
test-data/list.bencode Normal file
View File

@ -0,0 +1 @@
l4:spami42ee

View 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",
}

View File

@ -20,17 +20,45 @@ fn ron_to_json() {
let opt = Opt {
input: Input::Ron,
output: Output::Json,
format_in: None,
format_out: None,
pretty: true,
no_newline: false,
};
let input = example_to_vec("examples/materials.ron");
let input = example_to_vec("test-data/materials.ron");
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");
let control = example_to_string("test-data/materials.json");
assert_eq!(control, out);
}
#[test]
fn json5_read_json() {
let opt = Opt {
input: Input::Json5,
output: Output::Json,
format_in: None,
format_out: None,
pretty: true,
no_newline: false,
};
let input = example_to_vec("test-data/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("test-data/materials.json");
assert_eq!(control, out);
}