1use async_trait::async_trait;
2use daemon_console::{AppAction, AsyncCommandHandler, TerminalApp, get_info};
3use std::boxed::Box;
4
5#[tokio::main]
6async fn main() {
7 let mut app = TerminalApp::new();
8 register_commands(&mut app).await;
9 let _ = app
10 .run(&get_info!("App demo starting...", "Demo"), "")
11 .await;
12}
13
14async fn register_commands(app: &mut TerminalApp) {
15 app.register_async_command("register", Box::new(RegisterCommand {}));
16}
17
18#[derive(Clone)]
20struct RegisterCommand;
21
22#[async_trait]
23impl AsyncCommandHandler for RegisterCommand {
24 async fn execute_async(&mut self, app: &mut TerminalApp, args: &[&str]) -> String {
25 if args.len() < 2 {
26 return get_info!("Usage: register <command> <reply>", "CommandHelp");
27 }
28
29 let cmd = args[0];
30 let reply = args[1..].join(" ");
31
32 let handler =
34 Box::new(move |_app: &mut TerminalApp, _args: &[&str]| -> String { get_info!(&reply) });
35
36 if let Some(sender) = &app.action_sender {
38 let _ = sender.send(AppAction::RegisterCommand(cmd.to_string(), handler));
39 get_info!(
40 &format!("Command '{}' registered successfully!", cmd),
41 "CommandResp"
42 )
43 } else {
44 get_info!(
45 "Failed to register command: no action sender available",
46 "CommandResp"
47 )
48 }
49 }
50
51 fn box_clone(&self) -> Box<dyn AsyncCommandHandler> {
52 Box::new(self.clone())
53 }
54}