demo/
main.rs

1use daemon_console::{
2    AppAction, TerminalApp, events::DaemonConsoleEvent, get_info, get_warn, logger::LogLevel,
3    utils::get_local_timestring,
4};
5
6fn handle_user_input_event(
7    raw: &str,
8    timestamp: i64,
9    action_tx: &tokio::sync::mpsc::UnboundedSender<AppAction>,
10) {
11    if raw.trim() == "test" {
12        let _ = action_tx.send(AppAction::Info("ok".to_string()));
13    } else if raw.trim() == "hello" {
14        let _ = action_tx.send(AppAction::Info("Hello there!".to_string()));
15    } else if raw.trim().starts_with("echo ") {
16        let echo_content = raw.trim().strip_prefix("echo ").unwrap_or("");
17        let _ = action_tx.send(AppAction::Info(format!("Echo: {}", echo_content)));
18    }
19
20    let _ = action_tx.send(AppAction::Info(format!(
21        "event 'CommandPromptInput': raw='{}', local_time={}",
22        raw,
23        get_local_timestring(timestamp)
24    )));
25}
26
27fn handle_terminal_log_event(
28    level: LogLevel,
29    message: &str,
30    module_name: &Option<String>,
31    timestamp: i64,
32    action_tx: &tokio::sync::mpsc::UnboundedSender<AppAction>,
33) {
34    let _ = action_tx.send(AppAction::Debug(format!(
35        "event 'TerminalLog': level={:?}, message='{}', module_name='{:?}', timestamp={}",
36        level, message, module_name, timestamp
37    )));
38}
39
40fn handle_subprocess_log_event(
41    pid: u32,
42    message: &str,
43    timestamp: i64,
44    action_tx: &tokio::sync::mpsc::UnboundedSender<AppAction>,
45) {
46    let _ = action_tx.send(AppAction::Warn(format!(
47        "event 'SubprocessLog': pid={}, message='{}', timestamp={}",
48        pid, message, timestamp
49    )));
50}
51
52fn start_event_listener(
53    mut event_rx: tokio::sync::broadcast::Receiver<DaemonConsoleEvent>,
54    action_tx: tokio::sync::mpsc::UnboundedSender<AppAction>,
55) {
56    tokio::spawn(async move {
57        while let Ok(event) = event_rx.recv().await {
58            match event {
59                DaemonConsoleEvent::UserConsoleInput { raw, timestamp } => {
60                    handle_user_input_event(&raw, timestamp, &action_tx);
61                }
62                DaemonConsoleEvent::TerminalLog {
63                    level,
64                    message,
65                    module_name,
66                    timestamp,
67                } => {
68                    handle_terminal_log_event(level, &message, &module_name, timestamp, &action_tx);
69                }
70                DaemonConsoleEvent::SubprocessLog {
71                    pid,
72                    message,
73                    timestamp,
74                } => {
75                    handle_subprocess_log_event(pid, &message, timestamp, &action_tx);
76                }
77            }
78        }
79    });
80}
81
82#[tokio::main]
83async fn main() {
84    let mut app = TerminalApp::new();
85
86    app.set_unknown_command_handler(|_| {
87        get_warn!("The command system disabled for developing the event system.")
88    });
89
90    let action_tx = app
91        .get_action_sender()
92        .expect("Failed to get action sender");
93    let event_rx = app
94        .subscribe_events()
95        .expect("Failed to subscribe to events");
96
97    start_event_listener(event_rx, action_tx);
98
99    app.info("This message used for debugging 'TerminalLog' event.");
100
101    let _ = app
102        .run(&get_info!("App demo starting...", "Demo"), "")
103        .await;
104}