diff --git a/_typos.toml b/_typos.toml index b50e66ac..c378d1c5 100644 --- a/_typos.toml +++ b/_typos.toml @@ -1,6 +1,7 @@ [files] extend-exclude = [ "crates/toml_edit/tests/fixtures/**", + "crates/benchmarks/src/Cargo.*.toml", ] [default.extend-words] diff --git a/crates/benchmarks/Cargo.toml b/crates/benchmarks/Cargo.toml index 44fdd43b..815e74bb 100644 --- a/crates/benchmarks/Cargo.toml +++ b/crates/benchmarks/Cargo.toml @@ -8,11 +8,13 @@ rust-version.workspace = true [package.metadata.release] release = false +[dependencies] +serde = { version = "1.0.197", features = ["derive"] } + [dev-dependencies] toml = { path = "../toml" } toml_edit = { path = "../toml_edit" } toml_old = { version = "0.5.10", package = "toml" } -serde = { version = "1.0.197", features = ["derive"] } serde_json = "1.0.115" lexopt = "0.3.0" divan = "0.1.14" diff --git a/crates/benchmarks/benches/cargo.rs b/crates/benchmarks/benches/cargo.rs index feff7c6a..914e0716 100644 --- a/crates/benchmarks/benches/cargo.rs +++ b/crates/benchmarks/benches/cargo.rs @@ -1,7 +1,7 @@ #![allow(elided_lifetimes_in_paths)] mod toml_edit { - use super::{manifest, Data, MANIFESTS}; + use toml_benchmarks::{manifest, Data, MANIFESTS}; #[divan::bench(args=MANIFESTS)] fn document(sample: &Data) -> ::toml_edit::DocumentMut { @@ -15,7 +15,7 @@ mod toml_edit { } mod toml { - use super::{manifest, Data, MANIFESTS}; + use toml_benchmarks::{manifest, Data, MANIFESTS}; #[divan::bench(args=MANIFESTS)] fn document(sample: &Data) -> ::toml::Value { @@ -29,7 +29,7 @@ mod toml { } mod toml_v05 { - use super::{manifest, Data, MANIFESTS}; + use toml_benchmarks::{manifest, Data, MANIFESTS}; #[divan::bench(args=MANIFESTS)] fn document(sample: &Data) -> ::toml_old::Value { @@ -45,136 +45,3 @@ mod toml_v05 { fn main() { divan::main(); } - -#[derive(Debug)] -pub struct Data(&'static str, &'static str); - -impl Data { - pub const fn name(&self) -> &'static str { - self.0 - } - - pub const fn content(&self) -> &'static str { - self.1 - } -} - -impl std::fmt::Display for Data { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.name().fmt(f) - } -} - -const MANIFESTS: &[Data] = &[Data("0-minimal", MINIMAL), Data("1-medium", MEDIUM)]; - -const MINIMAL: &str = r#" -[package] -name = "bar" -version = "0.1.0" -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -"#; - -const MEDIUM: &str = include_str!("Cargo.cargo.toml"); - -mod manifest { - use std::collections::HashMap; - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Manifest { - package: Package, - #[serde(default)] - lib: Option, - #[serde(default)] - bin: Vec, - #[serde(default)] - features: HashMap>, - #[serde(default)] - dependencies: HashMap, - #[serde(default)] - build_dependencies: HashMap, - #[serde(default)] - dev_dependencies: HashMap, - #[serde(default)] - target: HashMap, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Package { - name: String, - version: String, - #[serde(default)] - edition: Option, - #[serde(default)] - authors: Vec, - #[serde(default)] - license: Option, - #[serde(default)] - homepage: Option, - #[serde(default)] - repository: Option, - #[serde(default)] - documentation: Option, - #[serde(default)] - readme: Option, - #[serde(default)] - description: Option, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Lib { - name: String, - #[serde(default)] - path: Option, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Bin { - name: String, - #[serde(default)] - test: bool, - #[serde(default)] - doc: bool, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - #[serde(untagged)] - pub(crate) enum Dependency { - Version(String), - Full(DependencyFull), - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct DependencyFull { - #[serde(default)] - version: Option, - #[serde(default)] - path: Option, - #[serde(default)] - default_features: bool, - #[serde(default)] - optional: bool, - #[serde(default)] - features: Vec, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Target { - #[serde(default)] - dependencies: HashMap, - #[serde(default)] - build_dependencies: HashMap, - #[serde(default)] - dev_dependencies: HashMap, - } -} diff --git a/crates/benchmarks/examples/bench.rs b/crates/benchmarks/examples/bench.rs index 35879187..95c09198 100644 --- a/crates/benchmarks/examples/bench.rs +++ b/crates/benchmarks/examples/bench.rs @@ -3,17 +3,22 @@ fn main() -> Result<(), lexopt::Error> { match args.parser { Parser::Document => { - let _doc = CARGO_MANIFEST.parse::().unwrap(); + let _doc = args + .data + .content() + .parse::() + .unwrap(); #[cfg(debug_assertions)] // Don't interefere with profiling drop(_doc); } Parser::De => { - let _doc = toml::from_str::(CARGO_MANIFEST).unwrap(); + let _doc = + toml::from_str::(args.data.content()).unwrap(); #[cfg(debug_assertions)] // Don't interefere with profiling drop(_doc); } Parser::Table => { - let _doc = CARGO_MANIFEST.parse::().unwrap(); + let _doc = args.data.content().parse::().unwrap(); #[cfg(debug_assertions)] // Don't interefere with profiling drop(_doc); } @@ -23,6 +28,7 @@ fn main() -> Result<(), lexopt::Error> { struct Args { parser: Parser, + data: toml_benchmarks::Data, } impl Args { @@ -32,6 +38,10 @@ impl Args { let mut parser = Parser::Document; let mut args = lexopt::Parser::from_env(); + let mut data = toml_benchmarks::MANIFESTS + .iter() + .find(|d| d.name() == "1-medium") + .unwrap(); while let Some(arg) = args.next()? { match arg { Long("parser") => { @@ -48,11 +58,24 @@ impl Args { } }; } + Long("manifest") => { + let name = args.value()?; + data = toml_benchmarks::MANIFESTS + .iter() + .find(|d| d.name() == name) + .ok_or_else(|| lexopt::Error::UnexpectedValue { + option: "manifest".to_owned(), + value: name.clone(), + })?; + } _ => return Err(arg.unexpected()), } } - Ok(Self { parser }) + Ok(Self { + parser, + data: *data, + }) } } @@ -61,104 +84,3 @@ enum Parser { De, Table, } - -mod manifest { - use std::collections::HashMap; - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Manifest { - package: Package, - #[serde(default)] - lib: Option, - #[serde(default)] - bin: Vec, - #[serde(default)] - features: HashMap>, - #[serde(default)] - dependencies: HashMap, - #[serde(default)] - build_dependencies: HashMap, - #[serde(default)] - dev_dependencies: HashMap, - #[serde(default)] - target: HashMap, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Package { - name: String, - version: String, - #[serde(default)] - edition: Option, - #[serde(default)] - authors: Vec, - #[serde(default)] - license: Option, - #[serde(default)] - homepage: Option, - #[serde(default)] - repository: Option, - #[serde(default)] - documentation: Option, - #[serde(default)] - readme: Option, - #[serde(default)] - description: Option, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Lib { - name: String, - #[serde(default)] - path: Option, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Bin { - name: String, - #[serde(default)] - test: bool, - #[serde(default)] - doc: bool, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - #[serde(untagged)] - pub(crate) enum Dependency { - Version(String), - Full(DependencyFull), - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct DependencyFull { - #[serde(default)] - version: Option, - #[serde(default)] - path: Option, - #[serde(default)] - default_features: bool, - #[serde(default)] - optional: bool, - #[serde(default)] - features: Vec, - } - - #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] - #[serde(rename_all = "kebab-case")] - pub(crate) struct Target { - #[serde(default)] - dependencies: HashMap, - #[serde(default)] - build_dependencies: HashMap, - #[serde(default)] - dev_dependencies: HashMap, - } -} - -const CARGO_MANIFEST: &str = include_str!("../benches/Cargo.cargo.toml"); diff --git a/crates/benchmarks/benches/Cargo.cargo.toml b/crates/benchmarks/src/Cargo.cargo.toml similarity index 100% rename from crates/benchmarks/benches/Cargo.cargo.toml rename to crates/benchmarks/src/Cargo.cargo.toml diff --git a/crates/benchmarks/src/lib.rs b/crates/benchmarks/src/lib.rs new file mode 100644 index 00000000..d01b1455 --- /dev/null +++ b/crates/benchmarks/src/lib.rs @@ -0,0 +1,132 @@ +#[derive(Copy, Clone, Debug)] +pub struct Data(&'static str, &'static str); + +impl Data { + pub const fn name(&self) -> &'static str { + self.0 + } + + pub const fn content(&self) -> &'static str { + self.1 + } +} + +impl std::fmt::Display for Data { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.name().fmt(f) + } +} + +pub const MANIFESTS: &[Data] = &[Data("0-minimal", MINIMAL), Data("1-medium", MEDIUM)]; + +const MINIMAL: &str = r#" +[package] +name = "bar" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +"#; + +const MEDIUM: &str = include_str!("Cargo.cargo.toml"); + +pub mod manifest { + use std::collections::HashMap; + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub struct Manifest { + package: Package, + #[serde(default)] + lib: Option, + #[serde(default)] + bin: Vec, + #[serde(default)] + features: HashMap>, + #[serde(default)] + dependencies: HashMap, + #[serde(default)] + build_dependencies: HashMap, + #[serde(default)] + dev_dependencies: HashMap, + #[serde(default)] + target: HashMap, + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub(crate) struct Package { + name: String, + version: String, + #[serde(default)] + edition: Option, + #[serde(default)] + authors: Vec, + #[serde(default)] + license: Option, + #[serde(default)] + homepage: Option, + #[serde(default)] + repository: Option, + #[serde(default)] + documentation: Option, + #[serde(default)] + readme: Option, + #[serde(default)] + description: Option, + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub(crate) struct Lib { + name: String, + #[serde(default)] + path: Option, + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub(crate) struct Bin { + name: String, + #[serde(default)] + test: bool, + #[serde(default)] + doc: bool, + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + #[serde(untagged)] + pub(crate) enum Dependency { + Version(String), + Full(DependencyFull), + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub(crate) struct DependencyFull { + #[serde(default)] + version: Option, + #[serde(default)] + path: Option, + #[serde(default)] + default_features: bool, + #[serde(default)] + optional: bool, + #[serde(default)] + features: Vec, + } + + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] + #[serde(rename_all = "kebab-case")] + pub(crate) struct Target { + #[serde(default)] + dependencies: HashMap, + #[serde(default)] + build_dependencies: HashMap, + #[serde(default)] + dev_dependencies: HashMap, + } +}