Skip to content

Commit 47e50b9

Browse files
committed
wip
1 parent b8c4a42 commit 47e50b9

File tree

10 files changed

+116
-59
lines changed

10 files changed

+116
-59
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ serde = ["dep:serde"]
2424
with-serde = ["serde"]
2525

2626
[dependencies]
27-
can-dbc-pest = { version = "0.4.0" }
27+
can-dbc-pest = { version = "0.5.0" }
2828
encoding_rs = { version = "0.8", optional = true }
2929
serde = { version = "1.0", features = ["derive"], optional = true }
3030
thiserror = "2.0.17"
@@ -57,5 +57,5 @@ cast_precision_loss = "allow"
5757
too_many_lines = "allow"
5858
missing_panics_doc = "allow"
5959

60-
#[patch.crates-io]
61-
#can-dbc-pest = { path = "../can-dbc-pest" }
60+
[patch.crates-io]
61+
can-dbc-pest = { path = "../can-dbc-pest" }

src/ast/access_node.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,30 @@
1+
use can_dbc_pest::{Pair, Rule};
2+
3+
use crate::DbcError;
4+
5+
// TODO: consider merging with Transmitter
6+
17
#[derive(Clone, Debug, PartialEq)]
28
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39
pub enum AccessNode {
410
VectorXXX,
511
Name(String),
612
}
13+
14+
impl TryFrom<Pair<'_, Rule>> for AccessNode {
15+
type Error = DbcError;
16+
17+
fn try_from(pair: Pair<'_, Rule>) -> Result<Self, Self::Error> {
18+
match pair.as_rule() {
19+
Rule::node_name => {
20+
let name = pair.as_str();
21+
Ok(if name == "VECTOR__XXX" {
22+
Self::VectorXXX
23+
} else {
24+
Self::Name(name.to_string())
25+
})
26+
}
27+
_ => Err(Self::Error::ParseError),
28+
}
29+
}
30+
}

src/ast/access_type.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
use can_dbc_pest::{Pair, Rule};
2+
3+
use crate::parser::{parse_uint, single_rule};
4+
use crate::DbcError;
5+
16
#[derive(Copy, Clone, Debug, PartialEq)]
27
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
38
pub enum AccessType {
@@ -6,3 +11,23 @@ pub enum AccessType {
611
DummyNodeVector2,
712
DummyNodeVector3,
813
}
14+
15+
impl TryFrom<Pair<'_, Rule>> for AccessType {
16+
type Error = DbcError;
17+
18+
fn try_from(pair: Pair<'_, Rule>) -> Result<Self, Self::Error> {
19+
match pair.as_rule() {
20+
Rule::access_type => {
21+
match parse_uint(single_rule(pair, Rule::uint)?)? {
22+
0 => Ok(Self::DummyNodeVector0),
23+
1 => Ok(Self::DummyNodeVector1),
24+
2 => Ok(Self::DummyNodeVector2),
25+
3 => Ok(Self::DummyNodeVector3),
26+
// FIXME: is this correct?
27+
_ => Ok(AccessType::DummyNodeVector0),
28+
}
29+
}
30+
_ => Err(Self::Error::ParseError),
31+
}
32+
}
33+
}

src/ast/attribute_default.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use can_dbc_pest::{Pair, Rule};
22

33
use crate::ast::AttributeValue;
4-
use crate::parser::{expect_empty, next_rule, parse_float, parse_str, DbcError, DbcResult};
4+
use crate::parser::{expect_empty, next_rule, parse_str, DbcError, DbcResult};
55

66
#[derive(Clone, Debug, PartialEq)]
77
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -14,16 +14,8 @@ impl AttributeDefault {
1414
/// Parse attribute default: `BA_DEF_DEF_ attribute_name default_value;`
1515
pub(crate) fn parse(pair: Pair<Rule>) -> DbcResult<Self> {
1616
let mut pairs = pair.into_inner();
17-
1817
let name = parse_str(next_rule(&mut pairs, Rule::attribute_name)?);
19-
20-
// Parse the value - could be quoted_str or number (num_str_value is silent)
21-
let value_pair = pairs.next().ok_or(DbcError::ParseError)?;
22-
let value = match value_pair.as_rule() {
23-
Rule::quoted_str => AttributeValue::String(parse_str(value_pair)),
24-
Rule::number => AttributeValue::Double(parse_float(value_pair)?),
25-
_ => return Err(DbcError::ParseError),
26-
};
18+
let value = pairs.next().ok_or(DbcError::ParseError)?.try_into()?;
2719
expect_empty(&mut pairs)?;
2820

2921
Ok(Self { name, value })

src/ast/attribute_value.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
use can_dbc_pest::{Pair, Rule};
2+
3+
use crate::parser::{parse_float, parse_str};
4+
use crate::DbcError;
5+
16
#[derive(Clone, Debug, PartialEq)]
27
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
38
pub enum AttributeValue {
@@ -6,3 +11,16 @@ pub enum AttributeValue {
611
Double(f64),
712
String(String),
813
}
14+
15+
impl TryFrom<Pair<'_, Rule>> for AttributeValue {
16+
type Error = DbcError;
17+
18+
fn try_from(pair: Pair<'_, Rule>) -> Result<Self, Self::Error> {
19+
match pair.as_rule() {
20+
Rule::quoted_str => Ok(Self::String(parse_str(pair))),
21+
Rule::number => Ok(Self::Double(parse_float(pair)?)),
22+
// FIXME: Add u64 and i64 parsing
23+
_ => Err(Self::Error::ParseError),
24+
}
25+
}
26+
}

src/ast/attribute_value_for_object.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use can_dbc_pest::{Pair, Rule};
22

33
use crate::ast::AttributeValuedForObjectType;
4-
use crate::parser::{expect_empty, next_rule, parse_float, parse_str, single_rule, DbcResult};
4+
use crate::parser::{
5+
expect_empty, next_rule, next_string, parse_float, parse_str, single_rule, DbcResult,
6+
};
57
use crate::{AttributeValue, MessageId};
68

79
#[derive(Clone, Debug, PartialEq)]
@@ -45,8 +47,7 @@ impl AttributeValueForObject {
4547
// Parse the message ID and signal name from the inner pairs
4648
let mut inner_pairs = pairs.into_inner();
4749
message_id = Some(next_rule(&mut inner_pairs, Rule::message_id)?.try_into()?);
48-
let v = next_rule(&mut inner_pairs, Rule::ident)?;
49-
signal_name = Some(v.as_str().to_string());
50+
signal_name = Some(next_string(&mut inner_pairs, Rule::ident)?);
5051
expect_empty(&mut inner_pairs)?;
5152
}
5253
Rule::env_var => {

src/ast/environment_variable.rs

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use can_dbc_pest::{Pair, Rule};
22

33
use crate::ast::{AccessNode, AccessType, EnvType};
4-
use crate::parser::{parse_int, parse_min_max_int, parse_str, single_rule, DbcResult};
4+
use crate::parser::{
5+
parse_int, parse_min_max_int, parse_str, single_string, DbcResult,
6+
};
57

68
#[derive(Clone, Debug, PartialEq)]
79
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -28,49 +30,25 @@ impl EnvironmentVariable {
2830
let mut unit = String::new();
2931
let mut initial_value = 0.0f64;
3032
let mut ev_id = 0i64;
31-
let mut access_type = String::new();
33+
let mut access_type = AccessType::DummyNodeVector0;
3234
let mut access_nodes = Vec::new();
3335

3436
for pairs in pair.into_inner() {
3537
match pairs.as_rule() {
36-
Rule::env_var => {
37-
let v = single_rule(pairs, Rule::env_var_name)?;
38-
name = v.as_str().to_string();
39-
}
38+
Rule::env_var => name = single_string(pairs, Rule::env_var_name)?,
4039
Rule::env_var_type_int => env_type = Some(EnvType::Integer),
4140
Rule::env_var_type_float => env_type = Some(EnvType::Float),
4241
Rule::env_var_type_string => env_type = Some(EnvType::String),
4342
Rule::min_max => (min, max) = parse_min_max_int(pairs)?,
4443
Rule::unit => unit = parse_str(pairs),
4544
Rule::init_value => initial_value = parse_int(pairs)? as f64,
4645
Rule::ev_id => ev_id = parse_int(pairs)?,
47-
Rule::node_name => {
48-
let node_name = pairs.as_str().to_string();
49-
if access_type.is_empty() {
50-
// First node_name is the access type
51-
access_type = node_name;
52-
} else {
53-
// Subsequent node_names are access nodes
54-
let access_node = if node_name == "VECTOR__XXX" {
55-
AccessNode::VectorXXX
56-
} else {
57-
AccessNode::Name(node_name)
58-
};
59-
access_nodes.push(access_node);
60-
}
61-
}
62-
_ => panic!("Unexpected rule: {:?}", pairs.as_rule()),
46+
Rule::access_type => access_type = pairs.try_into()?,
47+
Rule::node_name => access_nodes.push(pairs.try_into()?),
48+
_ => panic!("Unexpected rule: {pairs:?}"),
6349
}
6450
}
6551

66-
let access_type = match access_type.as_str() {
67-
"DUMMY_NODE_VECTOR1" => AccessType::DummyNodeVector1,
68-
"DUMMY_NODE_VECTOR2" => AccessType::DummyNodeVector2,
69-
"DUMMY_NODE_VECTOR3" => AccessType::DummyNodeVector3,
70-
// FIXME: is this correct?
71-
_ => AccessType::DummyNodeVector0,
72-
};
73-
7452
Ok(Self {
7553
name,
7654
typ: env_type.unwrap(),

src/ast/message_transmitter.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use can_dbc_pest::{Pair, Rule};
22

33
use crate::ast::{MessageId, Transmitter};
4-
use crate::parser::{next_rule, DbcResult};
4+
use crate::parser::{collect_expected, next_rule, DbcResult};
55

66
#[derive(Clone, Debug, PartialEq)]
77
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -17,18 +17,7 @@ impl MessageTransmitter {
1717
let mut pairs = pair.into_inner();
1818

1919
let message_id = next_rule(&mut pairs, Rule::message_id)?.try_into()?;
20-
21-
let mut transmitter = Vec::new();
22-
for pair2 in pairs {
23-
if pair2.as_rule() == Rule::transmitter {
24-
let name = pair2.as_str().to_string();
25-
transmitter.push(if name == "Vector__XXX" {
26-
Transmitter::VectorXXX
27-
} else {
28-
Transmitter::NodeName(name)
29-
});
30-
}
31-
}
20+
let transmitter = collect_expected(&mut pairs, Rule::transmitter)?;
3221

3322
Ok(Self {
3423
message_id,

src/ast/transmitter.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use can_dbc_pest::{Pair, Rule};
2+
3+
use crate::DbcError;
4+
5+
// TODO: consider merging with AccessNode
6+
17
#[derive(Clone, Debug, PartialEq)]
28
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39
pub enum Transmitter {
@@ -6,3 +12,21 @@ pub enum Transmitter {
612
/// message has no sender
713
VectorXXX,
814
}
15+
16+
impl TryFrom<Pair<'_, Rule>> for Transmitter {
17+
type Error = DbcError;
18+
19+
fn try_from(pair: Pair<'_, Rule>) -> Result<Self, Self::Error> {
20+
match pair.as_rule() {
21+
Rule::transmitter => {
22+
let name = pair.as_str();
23+
Ok(if name == "Vector__XXX" {
24+
Self::VectorXXX
25+
} else {
26+
Self::NodeName(name.to_string())
27+
})
28+
}
29+
_ => Err(Self::Error::ParseError),
30+
}
31+
}
32+
}

src/parser.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ pub(crate) fn single_rule(pair: Pair<Rule>, expected: Rule) -> DbcResult<Pair<Ru
6868
}
6969
}
7070

71+
/// Helper function to get a single pair, validate its rule, and convert to string
72+
#[allow(dead_code)]
73+
pub(crate) fn single_string(pair: Pair<Rule>, expected: Rule) -> DbcResult<String> {
74+
Ok(single_rule(pair, expected)?.as_str().to_string())
75+
}
76+
7177
/// Helper function to collect all remaining pairs of a specific rule type
7278
pub(crate) fn collect_all<'a, T: TryFrom<Pair<'a, Rule>, Error = DbcError>>(
7379
iter: &mut Pairs<'a, Rule>,

0 commit comments

Comments
 (0)