adrift_core/commands/
make_command.rs

1use crate::commands::Command;
2
3use convert_case::{Case, Casing};
4use std::fs::File;
5use std::io::prelude::*;
6use std::{collections::HashMap, env};
7
8pub struct MakeCommand;
9
10#[async_trait::async_trait]
11impl Command for MakeCommand {
12    fn name(&self) -> &'static str {
13        "make:command"
14    }
15
16    fn description(&self) -> &'static str {
17        "Create command"
18    }
19
20    fn args(&self) -> Vec<clap::Arg> {
21        vec![clap::arg!([name])]
22    }
23
24    fn require_rebuild(&self) -> bool {
25        true
26    }
27
28    async fn handle(&self, args: HashMap<String, String>) -> anyhow::Result<()> {
29        let name = args.get("name").expect("Name argument is required!");
30        
31        let file_name = name.to_case(Case::Snake);
32        let command_name = file_name.replace('_', ":");
33        let struct_name = name.to_case(Case::UpperCamel);
34
35        let file_path = format!(
36            "{}/commands/{}.rs",
37            env::var("CARGO_MANIFEST_DIR").unwrap(),
38            file_name
39        );
40
41        let file_dir = format!(
42            "{}/commands",
43            env::var("CARGO_MANIFEST_DIR").unwrap(),
44        );
45
46        println!("Creating command {}..", struct_name);
47
48        std::fs::create_dir_all(file_dir).unwrap();
49
50        let mut file = File::create(file_path).expect("Error encountered while creating file!");
51
52        let text = format!(r#"use std::collections::HashMap;
53
54use adrift::commands::Command;
55use adrift::anyhow;
56
57pub struct {struct_name};
58
59#[adrift::async_trait]
60impl Command for {struct_name} {{
61    fn name(&self) -> &'static str {{
62        "{command_name}"
63    }}
64
65    async fn handle(&self, _args: HashMap<String, String>) -> anyhow::Result<()> {{
66        Ok(())
67    }}
68}}
69        "#);
70
71        file.write_all(text.as_bytes())?;
72
73        Ok(())
74    }
75}