aboutsummaryrefslogtreecommitdiff
path: root/mingling_ci/src
diff options
context:
space:
mode:
Diffstat (limited to 'mingling_ci/src')
-rw-r--r--mingling_ci/src/bin/ci.rs1
-rw-r--r--mingling_ci/src/cmd.rs1
-rw-r--r--mingling_ci/src/cmd/cmd_show_features.rs26
-rw-r--r--mingling_ci/src/res.rs3
-rw-r--r--mingling_ci/src/res/features.rs47
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()
+}