adrift_core/commands/
make_command.rs1use 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}