can_dbc/ast/
message_transmitter.rs

1use can_dbc_pest::{Pair, Rule};
2
3use crate::ast::{MessageId, Transmitter};
4use crate::parser::{collect_expected, next_rule, validated_inner, DbcError};
5
6#[derive(Clone, Debug, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct MessageTransmitter {
9    pub message_id: MessageId,
10    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Vec::is_empty"))]
11    pub transmitter: Vec<Transmitter>,
12}
13
14impl TryFrom<Pair<'_, Rule>> for MessageTransmitter {
15    type Error = DbcError;
16
17    fn try_from(value: Pair<'_, Rule>) -> Result<Self, Self::Error> {
18        let mut pairs = validated_inner(value, Rule::message_transmitter)?;
19
20        Ok(Self {
21            message_id: next_rule(&mut pairs, Rule::message_id)?.try_into()?,
22            transmitter: collect_expected(&mut pairs, Rule::transmitter)?,
23        })
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use crate::test_helpers::*;
31
32    #[test]
33    fn message_transmitters_test() {
34        let def = "
35BO_TX_BU_ 12345 : XZY,ABC;
36";
37        let exp = MessageTransmitter {
38            message_id: MessageId::Standard(12345),
39            transmitter: vec![
40                Transmitter::NodeName("XZY".to_string()),
41                Transmitter::NodeName("ABC".to_string()),
42            ],
43        };
44        let val = test_into::<MessageTransmitter>(def.trim_start(), Rule::message_transmitter);
45        assert_eq!(val, exp);
46
47        // Same as above, but without space before the colon
48        let def = "
49BO_TX_BU_ 12345 :XZY,ABC;
50";
51        let val = test_into::<MessageTransmitter>(def.trim_start(), Rule::message_transmitter);
52        assert_eq!(val, exp);
53    }
54}