cargo_workflows/
workflow_getter.rs

1use std::collections::HashMap;
2
3use alloc::{collections::BTreeMap, string::String, vec::Vec};
4
5#[derive(Debug, thiserror::Error)]
6pub enum Error {
7    #[error("cannot open workflows.toml: {0}")]
8    FileOpenError(std::io::Error),
9    #[error("cannot parse workflows.toml: {0}")]
10    TomlParseError(toml::de::Error),
11    #[error("workflow \"{workflow}\" doesn't exist")]
12    WorkflowNotFound { workflow: String },
13}
14
15#[derive(Debug, Clone, serde::Deserialize)]
16pub struct Workflow {
17    pub env: Option<HashMap<String, String>>,
18    pub commands: BTreeMap<String, Vec<String>>,
19}
20
21/// Gets a workflow
22pub fn get_workflow(workflow: &str) -> Result<Workflow, Error> {
23    let contents = match std::fs::read_to_string("workflows.toml") {
24        Ok(v) => v,
25        Err(e) => return Err(Error::FileOpenError(e)),
26    };
27
28    let workflows: HashMap<String, Workflow> = match toml::de::from_str(&contents) {
29        Ok(v) => v,
30        Err(e) => return Err(Error::TomlParseError(e)),
31    };
32
33    let workflow = match workflows.iter().find_map(|v| {
34        if v.0 as &str == workflow {
35            Some(v.1)
36        } else {
37            None
38        }
39    }) {
40        Some(v) => v,
41        None => {
42            return Err(Error::WorkflowNotFound {
43                workflow: workflow.into(),
44            })
45        }
46    };
47
48    Ok(workflow.clone())
49}