Skip to main content

mk_lib/schema/
use_cargo.rs

1use hashbrown::HashMap;
2use schemars::JsonSchema;
3use serde::Deserialize;
4
5use crate::utils::resolve_path;
6
7use super::{
8  CommandRunner,
9  LocalRun,
10  Task,
11  TaskArgs,
12};
13
14#[derive(Debug, Deserialize, JsonSchema)]
15pub struct UseCargoArgs {
16  /// The working directory to run the command in
17  #[serde(default)]
18  pub work_dir: Option<String>,
19}
20
21#[derive(Debug, Deserialize, JsonSchema)]
22#[serde(untagged)]
23/// Enable cargo commands as tasks. Either `true` or an object with optional settings.
24pub enum UseCargo {
25  Bool(bool),
26  UseCargo(Box<UseCargoArgs>),
27}
28
29impl UseCargo {
30  pub fn capture(&self) -> anyhow::Result<HashMap<String, Task>> {
31    self.capture_in_dir(std::path::Path::new("."))
32  }
33
34  pub fn capture_in_dir(&self, base_dir: &std::path::Path) -> anyhow::Result<HashMap<String, Task>> {
35    match self {
36      UseCargo::Bool(true) => self.capture_tasks_in_dir(base_dir),
37      UseCargo::UseCargo(args) => args.capture_tasks_in_dir(base_dir),
38      _ => Ok(HashMap::new()),
39    }
40  }
41
42  fn capture_tasks_in_dir(&self, base_dir: &std::path::Path) -> anyhow::Result<HashMap<String, Task>> {
43    UseCargoArgs { work_dir: None }.capture_tasks_in_dir(base_dir)
44  }
45}
46
47impl UseCargoArgs {
48  pub fn capture_tasks(&self) -> anyhow::Result<HashMap<String, Task>> {
49    self.capture_tasks_in_dir(std::path::Path::new("."))
50  }
51
52  pub fn capture_tasks_in_dir(&self, base_dir: &std::path::Path) -> anyhow::Result<HashMap<String, Task>> {
53    let resolved_work_dir = self
54      .work_dir
55      .as_ref()
56      .map(|work_dir| resolve_path(base_dir, work_dir));
57    let cargo_commands = [
58      "add",
59      "bench",
60      "build",
61      "check",
62      "clean",
63      "clippy",
64      "doc",
65      "fix",
66      "fmt",
67      "init",
68      "install",
69      "miri",
70      "new",
71      "publish",
72      "remove",
73      "report",
74      "run",
75      "search",
76      "test",
77      "uninstall",
78      "update",
79    ];
80
81    let hm: HashMap<String, Task> = cargo_commands
82      .iter()
83      .map(|cmd| {
84        let command = format!("cargo {}", cmd);
85        let task = Task::Task(Box::new(TaskArgs {
86          commands: vec![CommandRunner::LocalRun(LocalRun {
87            command,
88            shell: None,
89            test: None,
90            work_dir: resolved_work_dir
91              .as_ref()
92              .map(|work_dir| work_dir.to_string_lossy().into_owned()),
93            interactive: Some(true),
94            retrigger: None,
95            ignore_errors: None,
96            save_output_as: None,
97            verbose: None,
98          })],
99          ..Default::default()
100        }));
101        (cmd.to_string(), task)
102      })
103      .collect();
104    Ok(hm)
105  }
106}