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}