Skip to main content

agent_can/cli/
output.rs

1use crate::protocol::{MailboxMessageData, Response, ResponseData};
2use comfy_table::{Cell, Row, Table, presets::UTF8_FULL};
3
4pub fn print_response(response: &Response, json: bool) {
5    if json {
6        println!(
7            "{}",
8            serde_json::to_string_pretty(response).expect("response should serialize")
9        );
10        return;
11    }
12
13    if !response.success {
14        eprintln!(
15            "{}",
16            response
17                .error
18                .as_deref()
19                .unwrap_or("request failed without error payload")
20        );
21        return;
22    }
23
24    match response.data.as_ref() {
25        Some(ResponseData::Ack) => println!("ok"),
26        Some(ResponseData::Status {
27            bus,
28            adapter,
29            dbc_path,
30            bitrate,
31            bitrate_data,
32            fd_capable,
33            mailbox_count,
34            rx_seen,
35            rx_decoded,
36            rx_dropped,
37        }) => {
38            println!(
39                "bus={bus} adapter={adapter} dbc={dbc_path} bitrate={bitrate} bitrate_data={bitrate_data} fd={fd_capable} mailboxes={mailbox_count} rx_seen={rx_seen} rx_decoded={rx_decoded} rx_dropped={rx_dropped}"
40            );
41        }
42        Some(ResponseData::Mailboxes { messages }) => print_mailboxes(messages),
43        Some(ResponseData::Mailbox { message }) => print_mailbox(message),
44        Some(ResponseData::SentRaw { arb_id, len }) => {
45            println!("sent raw arb_id=0x{arb_id:X} len={len}");
46        }
47        Some(ResponseData::SentMessage {
48            message,
49            arb_id,
50            len,
51        }) => {
52            println!("sent message={message} arb_id=0x{arb_id:X} len={len}");
53        }
54        None => println!("ok"),
55    }
56}
57
58fn print_mailboxes(messages: &[MailboxMessageData]) {
59    let mut table = Table::new();
60    table.load_preset(UTF8_FULL);
61    table.set_header(vec!["Message", "Arb ID", "Seq", "Signals"]);
62    for message in messages {
63        let signal_summary = message
64            .signals
65            .iter()
66            .map(|signal| match &signal.unit {
67                Some(unit) => format!("{}={} {}", signal.name, signal.value, unit),
68                None => format!("{}={}", signal.name, signal.value),
69            })
70            .collect::<Vec<_>>()
71            .join(", ");
72        table.add_row(Row::from(vec![
73            Cell::new(&message.message),
74            Cell::new(format!("0x{:X}", message.arb_id)),
75            Cell::new(message.update_seq),
76            Cell::new(signal_summary),
77        ]));
78    }
79    println!("{table}");
80}
81
82fn print_mailbox(message: &MailboxMessageData) {
83    println!(
84        "message={} arb_id=0x{:X} seq={} len={}",
85        message.message, message.arb_id, message.update_seq, message.len
86    );
87    for signal in &message.signals {
88        match &signal.unit {
89            Some(unit) => println!("{}={} {}", signal.name, signal.value, unit),
90            None => println!("{}={}", signal.name, signal.value),
91        }
92    }
93}