diff options
Diffstat (limited to 'mingling_ci/src')
| -rw-r--r-- | mingling_ci/src/bin/ci.rs | 1 | ||||
| -rw-r--r-- | mingling_ci/src/cmd.rs | 1 | ||||
| -rw-r--r-- | mingling_ci/src/cmd/cmd_show_features.rs | 26 | ||||
| -rw-r--r-- | mingling_ci/src/res.rs | 3 | ||||
| -rw-r--r-- | mingling_ci/src/res/features.rs | 47 |
5 files changed, 78 insertions, 0 deletions
diff --git a/mingling_ci/src/bin/ci.rs b/mingling_ci/src/bin/ci.rs index 1fb5120..e823000 100644 --- a/mingling_ci/src/bin/ci.rs +++ b/mingling_ci/src/bin/ci.rs @@ -41,6 +41,7 @@ async fn mingling_ci_begin() -> i32 { // CI Plugins program.with_setup(ManifestsSetup); + program.with_setup(FeaturesSetup); program.with_setup(ReportSetup); program.exec().await diff --git a/mingling_ci/src/cmd.rs b/mingling_ci/src/cmd.rs index 471a7af..30d65a1 100644 --- a/mingling_ci/src/cmd.rs +++ b/mingling_ci/src/cmd.rs @@ -1,3 +1,4 @@ pub(crate) mod cmd_report_clean; pub(crate) mod cmd_report_collect; +pub(crate) mod cmd_show_features; pub(crate) mod cmd_show_manifests; diff --git a/mingling_ci/src/cmd/cmd_show_features.rs b/mingling_ci/src/cmd/cmd_show_features.rs new file mode 100644 index 0000000..5fff0c5 --- /dev/null +++ b/mingling_ci/src/cmd/cmd_show_features.rs @@ -0,0 +1,26 @@ +use mingling::{ + Grouped, + macros::{buffer, command, r_println, renderer}, +}; + +use crate::res::ResFeatureList; + +#[command(node = "show-features")] +pub fn show_features(features: &ResFeatureList) -> ResultShowFeatures { + ResultShowFeatures { + features: features.list.clone(), + } +} + +/// The docs.rs feature list of `mingling`. +#[derive(Grouped)] +pub struct ResultShowFeatures { + pub features: Vec<String>, +} + +#[renderer(buffer)] +pub fn render_show_features(r: ResultShowFeatures) { + for feature in r.features { + r_println!("{feature}"); + } +} diff --git a/mingling_ci/src/res.rs b/mingling_ci/src/res.rs index 7e7b172..f794e7c 100644 --- a/mingling_ci/src/res.rs +++ b/mingling_ci/src/res.rs @@ -1,6 +1,9 @@ mod collect_logs; pub use collect_logs::*; +mod features; +pub use features::*; + mod manifests; pub use manifests::*; diff --git a/mingling_ci/src/res/features.rs b/mingling_ci/src/res/features.rs new file mode 100644 index 0000000..8009514 --- /dev/null +++ b/mingling_ci/src/res/features.rs @@ -0,0 +1,47 @@ +use mingling::{Program, macros::program_setup}; + +use crate::ThisProgram; + +/// Manifest that declares the documented feature list. +/// +/// Path is relative to the repo root (the CI's working directory). +const FEATURES_MANIFEST: &str = "./mingling/Cargo.toml"; + +/// The docs.rs feature list of `mingling`, the single source of truth for the +/// feature combinations used by CI checks. +#[derive(Default, Clone)] +pub struct ResFeatureList { + pub list: Vec<String>, +} + +#[program_setup] +pub fn features_setup(p: &mut Program<ThisProgram>) { + p.with_resource(ResFeatureList { + list: docs_rs_features(), + }); +} + +/// Reads `[package.metadata.docs.rs].features` from `mingling/Cargo.toml`. +#[must_use] +fn docs_rs_features() -> Vec<String> { + let Ok(content) = std::fs::read_to_string(FEATURES_MANIFEST) else { + return Vec::new(); + }; + let Ok(toml_value) = content.parse::<toml::Value>() else { + return Vec::new(); + }; + toml_value + .get("package") + .and_then(|p| p.get("metadata")) + .and_then(|m| m.get("docs")) + .and_then(|d| d.get("rs")) + .and_then(|rs| rs.get("features")) + .and_then(|f| f.as_array()) + .map(|features| { + features + .iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default() +} |
