veecle_os_data_support_can/generate.rs
1//! Macros to generate data types and Veecle OS actors from CAN-DBC
2
3// This is a wrapper macro instead of re-export so that we can pass the `$crate` token in
4// referring to this crate. This makes the macro resilient to dependency renaming and
5// re-exporting which a hardcoded `::veecle_os_data_support_can` path can't be.
6
7/// Parse a CAN-DBC file or source string and generate data types and Veecle OS actors to use with it.
8///
9/// ```rust
10/// veecle_os_data_support_can::generate!(
11/// mod from_file {
12/// #![dbc = include_str!("../../veecle-os-data-support-can-codegen/tests/cases/CSS-Electronics-SAE-J1939-DEMO.dbc")]
13/// }
14/// );
15///
16/// veecle_os_data_support_can::generate!(
17/// mod from_str {
18/// #![dbc = r#"
19/// VERSION ""
20///
21/// NS_ :
22///
23/// BO_ 2364540158 EEC1: 8 Vector__XXX
24/// SG_ EngineSpeed : 24|16@1+ (0.125,0) [0|8031.875] "rpm" Vector__XXX
25/// "#]
26/// }
27/// );
28///
29/// let _ = from_file::Eec1 {
30/// engine_speed: from_file::eec1::EngineSpeed::try_from(0.5).unwrap(),
31/// };
32///
33/// let _ = from_str::Eec1 {
34/// engine_speed: from_str::eec1::EngineSpeed::try_from(0.5).unwrap(),
35/// };
36/// ```
37#[macro_export]
38macro_rules! generate {
39 ($vis:vis mod $name:ident { #![dbc = include_str!($file:literal)] $($extra:tt)* }) => {
40 $crate::reƫxports::veecle_os_data_support_can_macros::from_file!($crate; $vis mod $name; $file; $($extra)* );
41 };
42
43 ($vis:vis mod $name:ident { #![dbc = $str:literal] $($extra:tt)* }) => {
44 $crate::reƫxports::veecle_os_data_support_can_macros::from_str!($crate; $vis mod $name; $str; $($extra)* );
45 };
46}