cargo_workflows/
workflow_getter.rs1use 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
21pub 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}