From 5411a3c5b8c6c767c68dd39fc7a7838e7eaa64e1 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 3 Dec 2021 18:57:47 +0200 Subject: feat: start on specifying data structure for benchmark specification Sponsored-by: author --- Cargo.lock | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 12 +++++ src/main.rs | 72 ++++++++++++++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a773c2b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,143 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "obnam-benchmark" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "serde_yaml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c608a35705a5d3cdc9fbe403147647ff34b921f8e833e49306df898f9b20af" +dependencies = [ + "dtoa", + "indexmap", + "serde", + "yaml-rust", +] + +[[package]] +name = "syn" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..77ca409 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "obnam-benchmark" +version = "0.1.0" +authors = ["Lars Wirzenius "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = { version = "1.0.101", features = ["derive"] } +serde_json = "1.0.72" +serde_yaml = "0.8.21" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ba54da8 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,72 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +struct Specification { + benchmarks: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Benchmark { + benchmark: String, + backups: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Backup { + changes: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +enum Change { + Create(CreateFiles), + Delete(FileCount), + Rename(FileCount), +} + +#[derive(Debug, Serialize, Deserialize)] +struct CreateFiles { + files: u64, + #[serde(with = "file_size")] + file_size: u64, +} + +#[derive(Debug, Serialize, Deserialize)] +struct FileCount { + files: u64, +} + +fn main() { + let yaml = r#" +benchmarks: +- benchmark: foo + backups: [] +"#; + let spec: Specification = serde_yaml::from_str(yaml).unwrap(); + serde_json::to_writer(std::io::stdout(), &spec).unwrap(); + println!(); +} + +mod file_size { + use serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer}; + + // This deserializer was originally written with u64 in mind. Then it was made generic by + // changing u64 to T everywhere and adding boundaries. Same with the serializer. + pub fn deserialize<'de, D, T>(deserializer: D) -> Result + where + D: Deserializer<'de>, + T: std::str::FromStr, + ::Err: std::fmt::Display, + { + String::deserialize(deserializer)? + .parse::() + .map_err(|e| D::Error::custom(format!("{}", e))) + } + + pub fn serialize(value: &T, serializer: S) -> Result + where + S: Serializer, + T: std::fmt::Display, + { + format!("{}", value).serialize(serializer) + } +} -- cgit v1.2.1