diff --git a/Cargo.lock b/Cargo.lock index fa6f07f..006e62f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,6 +160,12 @@ dependencies = [ "serde", ] +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "equivalent" version = "1.0.1" @@ -366,7 +372,9 @@ dependencies = [ "argh", "rand", "rstest", + "schemars", "serde", + "serde_json", "serde_with", "serde_yaml", "snafu", @@ -599,6 +607,30 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + [[package]] name = "semver" version = "1.0.24" @@ -625,11 +657,22 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", diff --git a/Cargo.toml b/Cargo.toml index f4259cf..c675ed0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,9 @@ edition = "2021" argh = "0.1.12" rand = "0.8.5" rstest = "0.23.0" +schemars = "0.8.21" serde = { version = "1.0.216", features = ["derive"] } +serde_json = "1.0.135" serde_with = "3.11.0" serde_yaml = "0.9.34+deprecated" snafu = "0.8.5" @@ -17,8 +19,8 @@ strum = { version = "0.26.3", features = ["derive"] } tracing = "0.1.41" [profile.release] -opt-level = "z" # Optimize for size. -lto = true # Enable Link Time Optimization +opt-level = "z" # Optimize for size. +lto = true # Enable Link Time Optimization codegen-units = 1 # Reduce number of codegen units to increase optimizations. -panic = "abort" # Abort on panic -strip = true # Automatically strip symbols from the binary. +panic = "abort" # Abort on panic +strip = true # Automatically strip symbols from the binary. diff --git a/tools/interu/Cargo.toml b/tools/interu/Cargo.toml index 4525038..411562c 100644 --- a/tools/interu/Cargo.toml +++ b/tools/interu/Cargo.toml @@ -3,11 +3,22 @@ name = "interu" version = "0.1.0" edition.workspace = true +[features] +default = [] +schemars = ["dep:schemars", "dep:serde_json"] + +[[bin]] +name = "interu-schema" +path = "src/generate_schema.rs" +required-features = ["schemars"] + [dependencies] argh.workspace = true rand.workspace = true rstest.workspace = true +schemars = { workspace = true, optional = true } serde.workspace = true +serde_json = { workspace = true, optional = true } serde_with.workspace = true serde_yaml.workspace = true snafu.workspace = true diff --git a/tools/interu/src/config/mod.rs b/tools/interu/src/config/mod.rs index a76e04a..49c9f97 100644 --- a/tools/interu/src/config/mod.rs +++ b/tools/interu/src/config/mod.rs @@ -5,6 +5,8 @@ use std::{ }; use rand::{distributions::WeightedIndex, prelude::Distribution as _, thread_rng}; +#[cfg(feature = "schemars")] +use schemars::JsonSchema; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; use tracing::instrument; @@ -64,6 +66,8 @@ pub enum ValidationError { InvalidProfileConfig { source: StrategyValidationError }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] +#[cfg_attr(feature = "schemars", schemars(rename = "Interu Config"))] #[derive(Debug, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Config { diff --git a/tools/interu/src/config/profile.rs b/tools/interu/src/config/profile.rs index fe53ebf..b7b7847 100644 --- a/tools/interu/src/config/profile.rs +++ b/tools/interu/src/config/profile.rs @@ -1,5 +1,7 @@ use std::{collections::BTreeMap, path::Path}; +#[cfg(feature = "schemars")] +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use snafu::{ensure, ResultExt, Snafu}; @@ -8,6 +10,7 @@ use crate::config::{ test::{self, TestDefinition}, }; +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct Profile { @@ -56,6 +59,7 @@ pub enum StrategyValidationError { }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(tag = "strategy", rename_all = "kebab-case")] pub enum Strategy { @@ -102,6 +106,7 @@ impl Strategy { } } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct WeightedOptions { @@ -151,6 +156,7 @@ impl WeightedOptions { } } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct Weight { @@ -158,6 +164,7 @@ pub struct Weight { pub runner: String, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct UseRunnerOptions { @@ -195,6 +202,7 @@ pub enum TestOptionsValidationError { UnknownTestSuite { test_suite: String }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct TestOptions { @@ -250,6 +258,7 @@ impl TestOptions { } } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Clone, Debug, Default, Deserialize, Serialize, strum::Display)] #[strum(serialize_all = "kebab-case")] #[serde(rename_all = "kebab-case")] diff --git a/tools/interu/src/config/runner.rs b/tools/interu/src/config/runner.rs index 016e932..baaa586 100644 --- a/tools/interu/src/config/runner.rs +++ b/tools/interu/src/config/runner.rs @@ -1,5 +1,7 @@ use std::{fmt::Display, str::FromStr}; +#[cfg(feature = "schemars")] +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; use snafu::{ensure, OptionExt, ResultExt as _, Snafu}; @@ -12,10 +14,12 @@ pub enum RunnerValidationError { ZeroNodeGroups { at: String }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Runner { + #[cfg_attr(feature = "schemars", schemars(with = "String"))] #[serde_as(as = "DisplayFromStr")] pub platform: PlatformPair, @@ -49,6 +53,7 @@ pub enum ParsePlatformTripleError { ParseDistribution { source: strum::ParseError }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug)] pub struct PlatformPair { pub distribution: Distribution, @@ -82,6 +87,7 @@ impl Display for PlatformPair { } } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, strum::Display, strum::EnumString)] #[strum(serialize_all = "lowercase")] #[serde(rename_all = "lowercase")] @@ -94,6 +100,7 @@ pub enum Distribution { Rke2, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, strum::Display, strum::EnumString)] #[strum(serialize_all = "kebab-case")] #[serde(rename_all = "kebab-case")] @@ -102,6 +109,7 @@ pub enum Architecture { Arm64, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum Size { @@ -110,6 +118,7 @@ pub enum Size { Large, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct NodeGroup { @@ -134,6 +143,7 @@ pub enum ConvertNodeGroupError { UnknownArchitecture { architecture: Architecture }, } +#[cfg_attr(feature = "schemars", derive(JsonSchema))] #[derive(Debug, Serialize)] #[serde(rename_all = "kebab-case")] pub struct ReplicatedNodeGroup<'a> { diff --git a/tools/interu/src/generate_schema.rs b/tools/interu/src/generate_schema.rs new file mode 100644 index 0000000..4248fd8 --- /dev/null +++ b/tools/interu/src/generate_schema.rs @@ -0,0 +1,5 @@ +fn main() { + let schema = schemars::schema_for!(interu::config::Config); + + println!("{}", serde_json::to_string_pretty(&schema).unwrap()); +} diff --git a/tools/interu/src/lib.rs b/tools/interu/src/lib.rs new file mode 100644 index 0000000..39c4b42 --- /dev/null +++ b/tools/interu/src/lib.rs @@ -0,0 +1,2 @@ +pub mod config; +pub mod instances;