Skip to content

Commit

Permalink
Pass message ids by value
Browse files Browse the repository at this point in the history
  • Loading branch information
marcelbuesing committed Nov 25, 2019
1 parent 5cd6856 commit b177c7e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 61 deletions.
68 changes: 33 additions & 35 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ SIG_VALTYPE_ 2000 Signal_8 : 1;
fn lookup_signal_comment() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let comment = dbc_content
.signal_comment(&MessageId(1840), "Signal_4")
.signal_comment(MessageId(1840), "Signal_4")
.expect("Signal comment missing");
assert_eq!(
"asaklfjlsdfjlsdfgls\nHH?=(%)/&KKDKFSDKFKDFKSDFKSDFNKCnvsdcvsvxkcv",
Expand All @@ -170,31 +170,31 @@ SIG_VALTYPE_ 2000 Signal_8 : 1;
#[test]
fn lookup_signal_comment_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let comment = dbc_content.signal_comment(&MessageId(1840), "Signal_2");
let comment = dbc_content.signal_comment(MessageId(1840), "Signal_2");
assert_eq!(None, comment);
}

#[test]
fn lookup_message_comment() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let comment = dbc_content
.message_comment(&MessageId(1840))
.message_comment(MessageId(1840))
.expect("Message comment missing");
assert_eq!("Some Message comment", comment);
}

#[test]
fn lookup_message_comment_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let comment = dbc_content.message_comment(&MessageId(2000));
let comment = dbc_content.message_comment(MessageId(2000));
assert_eq!(None, comment);
}

#[test]
fn lookup_value_descriptions_for_signal() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let val_descriptions = dbc_content
.value_descriptions_for_signal(&MessageId(2000), "Signal_3")
.value_descriptions_for_signal(MessageId(2000), "Signal_3")
.expect("Message comment missing");

let exp = vec![ValDescription {
Expand All @@ -208,15 +208,15 @@ SIG_VALTYPE_ 2000 Signal_8 : 1;
fn lookup_value_descriptions_for_signal_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let val_descriptions =
dbc_content.value_descriptions_for_signal(&MessageId(2000), "Signal_2");
dbc_content.value_descriptions_for_signal(MessageId(2000), "Signal_2");
assert_eq!(None, val_descriptions);
}

#[test]
fn lookup_extended_value_type_for_signal() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let extended_value_type =
dbc_content.extended_value_type_for_signal(&MessageId(2000), "Signal_8");
dbc_content.extended_value_type_for_signal(MessageId(2000), "Signal_8");
assert_eq!(
extended_value_type,
Some(&SignalExtendedValueType::IEEEfloat32Bit)
Expand All @@ -227,43 +227,38 @@ SIG_VALTYPE_ 2000 Signal_8 : 1;
fn lookup_extended_value_type_for_signal_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let extended_value_type =
dbc_content.extended_value_type_for_signal(&MessageId(2000), "Signal_1");
dbc_content.extended_value_type_for_signal(MessageId(2000), "Signal_1");
assert_eq!(extended_value_type, None);
}

#[test]
fn lookup_signal_by_name() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let signal =
dbc_content.signal_by_name(MessageId(2000), "Signal_8");
let signal = dbc_content.signal_by_name(MessageId(2000), "Signal_8");
assert!(signal.is_some());
}

#[test]
fn lookup_signal_by_name_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let signal =
dbc_content.signal_by_name(MessageId(2000), "Signal_25");
let signal = dbc_content.signal_by_name(MessageId(2000), "Signal_25");
assert_eq!(signal, None);
}

#[test]
fn lookup_multiplex_indicator_switch() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let multiplexor_switch =
dbc_content.message_multiplexor_switch(MessageId(3040));
let multiplexor_switch = dbc_content.message_multiplexor_switch(MessageId(3040));
assert!(multiplexor_switch.is_some());
assert_eq!(multiplexor_switch.unwrap().name(), "Switch");
}

#[test]
fn lookup_multiplex_indicator_switch_none_when_missing() {
let dbc_content = DBC::from_slice(SAMPLE_DBC).expect("Failed to parse DBC");
let multiplexor_switch =
dbc_content.message_multiplexor_switch(MessageId(1840));
let multiplexor_switch = dbc_content.message_multiplexor_switch(MessageId(1840));
assert!(multiplexor_switch.is_none());
}

}

/// Possible error cases for `can-dbc`
Expand Down Expand Up @@ -651,27 +646,30 @@ impl DBC {
}

pub fn signal_by_name(&self, message_id: MessageId, signal_name: &str) -> Option<&Signal> {
let message = self.messages
let message = self
.messages
.iter()
.find(|message| message.message_id == message_id);

if let Some(message) = message {
return message.signals.iter()
.find(|signal| signal.name == *signal_name);
return message
.signals
.iter()
.find(|signal| signal.name == *signal_name);
}
None
}

/// Lookup a message comment
pub fn message_comment(&self, message_id: &MessageId) -> Option<&str> {
pub fn message_comment(&self, message_id: MessageId) -> Option<&str> {
self.comments
.iter()
.filter_map(|x| match x {
Comment::Message {
message_id: ref x_message_id,
ref comment,
} => {
if x_message_id == message_id {
if *x_message_id == message_id {
Some(comment.as_str())
} else {
None
Expand All @@ -683,7 +681,7 @@ impl DBC {
}

/// Lookup a signal comment
pub fn signal_comment(&self, message_id: &MessageId, signal_name: &str) -> Option<&str> {
pub fn signal_comment(&self, message_id: MessageId, signal_name: &str) -> Option<&str> {
self.comments
.iter()
.filter_map(|x| match x {
Expand All @@ -692,7 +690,7 @@ impl DBC {
signal_name: ref x_signal_name,
comment,
} => {
if x_message_id == message_id && x_signal_name == signal_name {
if *x_message_id == message_id && x_signal_name == signal_name {
Some(comment.as_str())
} else {
None
Expand All @@ -706,7 +704,7 @@ impl DBC {
/// Lookup value descriptions for signal
pub fn value_descriptions_for_signal(
&self,
message_id: &MessageId,
message_id: MessageId,
signal_name: &str,
) -> Option<&[ValDescription]> {
self.value_descriptions
Expand All @@ -717,7 +715,7 @@ impl DBC {
signal_name: ref x_signal_name,
ref value_descriptions,
} => {
if x_message_id == message_id && x_signal_name == signal_name {
if *x_message_id == message_id && x_signal_name == signal_name {
Some(value_descriptions.as_slice())
} else {
None
Expand All @@ -731,7 +729,7 @@ impl DBC {
/// Lookup the extended value for a given signal
pub fn extended_value_type_for_signal(
&self,
message_id: &MessageId,
message_id: MessageId,
signal_name: &str,
) -> Option<&SignalExtendedValueType> {
self.signal_extended_value_type_list
Expand All @@ -742,7 +740,7 @@ impl DBC {
signal_name: ref x_signal_name,
ref signal_extended_value_type,
} => {
if x_message_id == message_id && x_signal_name == signal_name {
if *x_message_id == message_id && x_signal_name == signal_name {
Some(signal_extended_value_type)
} else {
None
Expand All @@ -753,17 +751,17 @@ impl DBC {
}

/// Lookup the message multiplexor switch signal for a given message
pub fn message_multiplexor_switch(
&self,
message_id: MessageId
) -> Option<&Signal> {
let message = self.messages
pub fn message_multiplexor_switch(&self, message_id: MessageId) -> Option<&Signal> {
let message = self
.messages
.iter()
.find(|message| message.message_id == message_id);

if let Some(message) = message {
return message.signals.iter()
.find(|signal| signal.multiplexer_indicator == MultiplexIndicator::Multiplexor);
return message
.signals
.iter()
.find(|signal| signal.multiplexer_indicator == MultiplexIndicator::Multiplexor);
}
None
}
Expand Down
52 changes: 26 additions & 26 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -490,42 +490,42 @@ fn is_quote(chr: char) -> bool {
chr == '"'
}

/// Multi space
// Multi space
named!(multispace1<CompleteByteSlice, Vec<char>>, many1!(char!(' ')));

/// Abreviation for multispace1
// Abreviation for multispace1
named!(ms<CompleteByteSlice, Vec<char>>, many1!(char!(' ')));

/// Colon
// Colon
named!(colon<CompleteByteSlice, char>, char!(':'));

/// Comma aka ','
// Comma aka ','
named!(comma<CompleteByteSlice, char>, char!(','));

/// Comma aka ';'
// Comma aka ';'
named!(semi_colon<CompleteByteSlice, char>, char!(';'));

/// Quote aka '"'
// Quote aka '"'
named!(quote<CompleteByteSlice, char>, char!('"'));

named!(pipe<CompleteByteSlice, char>, char!('|'));

named!(at<CompleteByteSlice, char>, char!('@'));

/// brace open aka '('
// brace open aka '('
named!(brc_open<CompleteByteSlice, char>, char!('('));

/// brace close aka '('
// brace close aka '('
named!(brc_close<CompleteByteSlice, char>, char!(')'));

/// bracket open aka '['
// bracket open aka '['
named!(brk_open<CompleteByteSlice, char>, char!('['));

/// bracket close aka ']'
// bracket close aka ']'
named!(brk_close<CompleteByteSlice, char>, char!(']'));

/// A valid C_identifier. C_identifiers start with a alphacharacter or an underscore
/// and may further consist of alpha­numeric, characters and underscore
// A valid C_identifier. C_identifiers start with a alphacharacter or an underscore
// and may further consist of alpha­numeric, characters and underscore
named!(c_ident<CompleteByteSlice, String>,
map_res!(
recognize!(
Expand Down Expand Up @@ -560,7 +560,7 @@ named!(i64_digit<CompleteByteSlice, i64>,
named!(char_string<CompleteByteSlice, String>,
do_parse!(
quote >>
s: take_till_s!(|c| is_quote(c as char)) >>
s: take_till!(|c| is_quote(c as char)) >>
quote >>
(String::from_utf8_lossy(s.as_bytes()).to_string())
)
Expand Down Expand Up @@ -622,7 +622,7 @@ named!(pub bit_timing<CompleteByteSlice, Vec<Baudrate>>,
multispace0 >>
tag!("BS_:") >>
baudrates: opt!(preceded!(ms, separated_list!(comma, map!(u64_s, Baudrate)))) >>
(baudrates.unwrap_or(Vec::new()))
(baudrates.unwrap_or_default())
)
);

Expand Down Expand Up @@ -840,15 +840,15 @@ named!(env_float<CompleteByteSlice, EnvType>, value!(EnvType::EnvTypeFloat, char
named!(env_int<CompleteByteSlice, EnvType>, value!(EnvType::EnvTypeu64, char!('1')));
named!(env_data<CompleteByteSlice, EnvType>, value!(EnvType::EnvTypeData, char!('2')));

/// 9 Environment Variable Definitions
// 9 Environment Variable Definitions
named!(pub env_var_type<CompleteByteSlice, EnvType>, alt_complete!(env_float | env_int | env_data));

named!(dummy_node_vector_0<CompleteByteSlice, AccessType>, value!(AccessType::DummyNodeVector0, char!('0')));
named!(dummy_node_vector_1<CompleteByteSlice, AccessType>, value!(AccessType::DummyNodeVector1, char!('1')));
named!(dummy_node_vector_2<CompleteByteSlice, AccessType>, value!(AccessType::DummyNodeVector2, char!('2')));
named!(dummy_node_vector_3<CompleteByteSlice, AccessType>, value!(AccessType::DummyNodeVector3, char!('3')));

/// 9 Environment Variable Definitions
// 9 Environment Variable Definitions
named!(pub access_type<CompleteByteSlice, AccessType>,
do_parse!(
tag!("DUMMY_NODE_VECTOR") >>
Expand All @@ -860,10 +860,10 @@ named!(pub access_type<CompleteByteSlice, AccessType>,
named!(access_node_vector_xxx<CompleteByteSlice, AccessNode>, value!(AccessNode::AccessNodeVectorXXX, tag!("VECTOR_XXX")));
named!(access_node_name<CompleteByteSlice, AccessNode>, map!(c_ident, |name| AccessNode::AccessNodeName(name)));

/// 9 Environment Variable Definitions
// 9 Environment Variable Definitions
named!(pub access_node<CompleteByteSlice, AccessNode>, alt_complete!(access_node_vector_xxx | access_node_name));

/// 9 Environment Variable Definitions
// 9 Environment Variable Definitions
named!(pub environment_variable<CompleteByteSlice, EnvironmentVariable>,
do_parse!(
multispace0 >>
Expand Down Expand Up @@ -1069,7 +1069,7 @@ named!(pub attribute_definition_node<CompleteByteSlice, AttributeDefinition>,
do_parse!(
tag!("BU_") >>
ms >>
x: map!(take_till_s!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
x: map!(take_till!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
(AttributeDefinition::Node(x))
)
);
Expand All @@ -1079,7 +1079,7 @@ named!(pub attribute_definition_signal<CompleteByteSlice, AttributeDefinition>,
do_parse!(
tag!("SG_") >>
ms >>
x: map!(take_till_s!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
x: map!(take_till!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
(AttributeDefinition::Signal(x))
)
);
Expand All @@ -1089,7 +1089,7 @@ named!(pub attribute_definition_environment_variable<CompleteByteSlice, Attribut
do_parse!(
tag!("EV_") >>
ms >>
x: map!(take_till_s!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
x: map!(take_till!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
(AttributeDefinition::EnvironmentVariable(x))
)
);
Expand All @@ -1099,15 +1099,15 @@ named!(pub attribute_definition_message<CompleteByteSlice, AttributeDefinition>,
do_parse!(
tag!("BO_") >>
ms >>
x: map!(take_till_s!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
x: map!(take_till!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
(AttributeDefinition::Message(x))
)
);

// TODO add properties
named!(pub attribute_definition_plain<CompleteByteSlice, AttributeDefinition>,
do_parse!(
x: map!(take_till_s!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
x: map!(take_till!(|c |is_semi_colon(c as char)), |x| String::from_utf8(x.as_bytes().to_vec()).unwrap()) >>
(AttributeDefinition::Plain(x))
)
);
Expand Down Expand Up @@ -1149,9 +1149,9 @@ named!(pub new_symbols<CompleteByteSlice, Vec<Symbol>>,
)
);

///
/// Network node
///
//
// Network node
//
named!(pub node<CompleteByteSlice, Node>,
do_parse!(
multispace0 >>
Expand Down

0 comments on commit b177c7e

Please sign in to comment.