mk_lib/schema/
use_cargo.rs1use 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 #[serde(default)]
18 pub work_dir: Option<String>,
19}
20
21#[derive(Debug, Deserialize, JsonSchema)]
22#[serde(untagged)]
23pub 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}