aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/argument_parsing.rs
diff options
context:
space:
mode:
authordatdenkikniet <jcdra1@gmail.com>2023-04-14 23:59:23 +0200
committerdatdenkikniet <jcdra1@gmail.com>2023-04-16 13:08:46 +0200
commit63b7024cb98717dd785ae888f419002b9835c6b1 (patch)
treeb65d1bc57d1f10c76cb053542095668b94246f09 /xtask/src/argument_parsing.rs
parentcba786529a7e34ed623df5f7cde5aae762a8c55c (diff)
xtask: build usage examples and general improvements
Diffstat (limited to 'xtask/src/argument_parsing.rs')
-rw-r--r--xtask/src/argument_parsing.rs53
1 files changed, 51 insertions, 2 deletions
diff --git a/xtask/src/argument_parsing.rs b/xtask/src/argument_parsing.rs
index 3ee9e34..d74ba69 100644
--- a/xtask/src/argument_parsing.rs
+++ b/xtask/src/argument_parsing.rs
@@ -190,8 +190,8 @@ pub enum BuildOrCheck {
#[derive(Parser, Clone)]
pub struct Globals {
- /// For which backend to build (defaults to thumbv7)
- #[arg(value_enum, short, long, global = true)]
+ /// For which backend to build.
+ #[arg(value_enum, short, default_value = "thumbv7", long, global = true)]
pub backend: Option<Backends>,
/// List of comma separated examples to include, all others are excluded
@@ -300,6 +300,55 @@ pub enum Commands {
/// Build books with mdbook
Book(Arg),
+
+ /// Check one or more usage examples.
+ ///
+ /// Usage examples are located in ./examples
+ UsageExamplesCheck(UsageExamples),
+
+ /// Build one or more usage examples.
+ ///
+ /// Usage examples are located in ./examples
+ #[clap(alias = "./examples")]
+ UsageExampleBuild(UsageExamples),
+}
+
+#[derive(Args, Clone, Debug)]
+pub struct UsageExamples {
+ /// The usage examples to build. All usage examples are selected if this argument is not provided.
+ ///
+ /// Example: `rp2040_local_i2c_init,stm32f3_blinky`.
+ examples: Option<String>,
+}
+
+impl UsageExamples {
+ pub fn examples(&self) -> anyhow::Result<Vec<String>> {
+ let usage_examples: Vec<_> = std::fs::read_dir("./examples")?
+ .filter_map(Result::ok)
+ .filter(|p| p.metadata().ok().map(|p| p.is_dir()).unwrap_or(false))
+ .filter_map(|p| p.file_name().as_os_str().to_str().map(ToString::to_string))
+ .collect();
+
+ let selected_examples: Option<Vec<String>> = self
+ .examples
+ .clone()
+ .map(|s| s.split(",").map(ToString::to_string).collect());
+
+ if let Some(selected_examples) = selected_examples {
+ if let Some(unfound_example) = selected_examples
+ .iter()
+ .find(|e| !usage_examples.contains(e))
+ {
+ Err(anyhow::anyhow!(
+ "Usage example {unfound_example} does not exist"
+ ))
+ } else {
+ Ok(selected_examples)
+ }
+ } else {
+ Ok(usage_examples)
+ }
+ }
}
#[derive(Args, Debug, Clone)]