use crate::types::database::{CanDatabase, CanNodeKey};
pub(crate) fn decode(db: &mut CanDatabase, line: &str) {
let mut parts = line.trim().trim_end_matches(';').split_ascii_whitespace();
match parts.next() {
Some("BO_TX_BU_") => {}
_ => return,
}
let id: u32 = match parts.next() {
Some(a) => a.parse::<u32>().unwrap_or(0),
None => return,
};
if id == 0 {
return;
}
let nodes_part: &str = match parts.next() {
Some(a) => a.trim_start_matches(':'),
None => return,
};
let mut node_keys: Vec<CanNodeKey> = Vec::new();
for token in nodes_part.split(',') {
let name: &str = token.trim();
if name.is_empty() {
continue;
}
if let Some(k) = db.get_node_key_by_name(name) {
node_keys.push(k);
}
}
if node_keys.is_empty() {
return;
}
let Some(msg_key) = db.get_msg_key_by_id(id) else {
return;
};
{
if let Some(msg) = db.get_message_by_key_mut(msg_key) {
for &nk in &node_keys {
if !msg.sender_nodes.contains(&nk) {
msg.sender_nodes.push(nk);
}
}
} else {
return;
}
}
for &nk in &node_keys {
let _ = db.add_sender_relation(msg_key, nk);
}
}