demo/
main.rs

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/// 异步命令处理器用于注册新命令
19#[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        // 创建一个新的命令处理器
33        let handler =
34            Box::new(move |_app: &mut TerminalApp, _args: &[&str]| -> String { get_info!(&reply) });
35
36        // 通过action_sender发送注册命令的请求
37        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}