1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3use uuid::Uuid;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Request {
7 pub id: Uuid,
8 pub action: RequestAction,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(tag = "type", content = "payload", rename_all = "snake_case")]
13pub enum RequestAction {
14 Status,
15 Mailboxes,
16 Mailbox {
17 message: String,
18 },
19 SendRaw {
20 arb_id: u32,
21 data_hex: String,
22 flags: Option<u8>,
23 },
24 SendMessage {
25 message: String,
26 signals: BTreeMap<String, f64>,
27 },
28 Close,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct Response {
33 pub id: Uuid,
34 pub success: bool,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub data: Option<ResponseData>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub error: Option<String>,
39}
40
41impl Response {
42 pub fn ok(id: Uuid, data: ResponseData) -> Self {
43 Self {
44 id,
45 success: true,
46 data: Some(data),
47 error: None,
48 }
49 }
50
51 pub fn err(id: Uuid, message: impl Into<String>) -> Self {
52 Self {
53 id,
54 success: false,
55 data: None,
56 error: Some(message.into()),
57 }
58 }
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
63pub enum ResponseData {
64 Ack,
65 Status {
66 bus: String,
67 adapter: String,
68 dbc_path: String,
69 bitrate: u32,
70 bitrate_data: u32,
71 fd_capable: bool,
72 mailbox_count: usize,
73 rx_seen: u64,
74 rx_decoded: u64,
75 rx_dropped: u64,
76 },
77 Mailboxes {
78 messages: Vec<MailboxMessageData>,
79 },
80 Mailbox {
81 message: MailboxMessageData,
82 },
83 SentRaw {
84 arb_id: u32,
85 len: u8,
86 },
87 SentMessage {
88 message: String,
89 arb_id: u32,
90 len: u8,
91 },
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct MailboxMessageData {
96 pub message: String,
97 pub arb_id: u32,
98 pub extended: bool,
99 pub len: u8,
100 pub update_seq: u64,
101 pub signals: Vec<MailboxSignalData>,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct MailboxSignalData {
106 pub name: String,
107 pub value: f64,
108 pub unit: Option<String>,
109}