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}