summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-12-03 18:57:47 +0200
committerLars Wirzenius <liw@liw.fi>2021-12-03 18:57:47 +0200
commit5411a3c5b8c6c767c68dd39fc7a7838e7eaa64e1 (patch)
treeed54bc572220ba517b213ef059c16160d8b12108
parent63ff98237fbb0d890d8ea479df1ef855ab5056db (diff)
downloadobnam-benchmark-5411a3c5b8c6c767c68dd39fc7a7838e7eaa64e1.tar.gz
feat: start on specifying data structure for benchmark specification
Sponsored-by: author
-rw-r--r--Cargo.lock143
-rw-r--r--Cargo.toml12
-rw-r--r--src/main.rs72
3 files changed, 227 insertions, 0 deletions
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 <liw@liw.fi>"]
+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<Benchmark>,
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+struct Benchmark {
+ benchmark: String,
+ backups: Vec<Backup>,
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+struct Backup {
+ changes: Vec<Change>,
+}
+
+#[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<T, D::Error>
+ where
+ D: Deserializer<'de>,
+ T: std::str::FromStr,
+ <T as std::str::FromStr>::Err: std::fmt::Display,
+ {
+ String::deserialize(deserializer)?
+ .parse::<T>()
+ .map_err(|e| D::Error::custom(format!("{}", e)))
+ }
+
+ pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ T: std::fmt::Display,
+ {
+ format!("{}", value).serialize(serializer)
+ }
+}