From df1c5c788b9879c7021fef16a68facb12634e59a Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 10 Aug 2021 14:28:23 -0500 Subject: [PATCH] Initial toml-test --- Cargo.toml | 16 +++++++++ src/encoded.rs | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + tests/encoded.rs | 6 ++++ 4 files changed, 108 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/encoded.rs create mode 100644 src/lib.rs create mode 100644 tests/encoded.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..569ecb3 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,16 @@ +[workspace] +members = [ + "crates/data", +] + +[package] +name = "toml-test" +version = "0.1.0" +edition = "2018" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dev-dependencies] +toml-test-data = { version = "1", path = "crates/data" } diff --git a/src/encoded.rs b/src/encoded.rs new file mode 100644 index 0000000..fc013ba --- /dev/null +++ b/src/encoded.rs @@ -0,0 +1,85 @@ +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] +pub enum Encoded { + Value(EncodedValue), + Table(std::collections::HashMap), + Array(Vec), +} + +impl Encoded { + pub fn from_slice(v: &[u8]) -> Result { + serde_json::from_slice(v) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct EncodedValue { + #[serde(rename = "type")] + toml_type: EncodedValueType, + value: String, +} + +impl<'a> From<&'a str> for EncodedValue { + fn from(other: &'a str) -> Self { + Self { + toml_type: EncodedValueType::String, + value: other.to_owned(), + } + } +} + +impl From for EncodedValue { + fn from(other: String) -> Self { + Self { + toml_type: EncodedValueType::String, + value: other, + } + } +} + +impl From for EncodedValue { + fn from(other: i64) -> Self { + Self { + toml_type: EncodedValueType::Integer, + value: other.to_string(), + } + } +} + +impl From for EncodedValue { + fn from(other: bool) -> Self { + Self { + toml_type: EncodedValueType::Integer, + value: other.to_string(), + } + } +} + +impl From for EncodedValue { + fn from(other: f64) -> Self { + let s = format!("{:.15}", other); + let s = s.trim_end_matches('0'); + let s = if s.ends_with('.') { + format!("{}0", s) + } else { + s.to_owned() + }; + Self { + toml_type: EncodedValueType::Integer, + value: s, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum EncodedValueType { + String, + Integer, + Float, + Bool, + Datetime, + DatetimeLocal, + DateLocal, + TimeLocal, +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2bd3a8a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod encoded; diff --git a/tests/encoded.rs b/tests/encoded.rs new file mode 100644 index 0000000..8de56e9 --- /dev/null +++ b/tests/encoded.rs @@ -0,0 +1,6 @@ +#[test] +fn can_load() { + for valid in toml_test_data::valid() { + toml_test::encoded::Encoded::from_slice(valid.expected).unwrap(); + } +}