abstract_bits_derive/lib.rs
1use proc_macro_error2::proc_macro_error;
2
3mod model;
4use model::Model;
5mod codegen;
6use codegen::codegen;
7mod errors;
8
9/// # Warning
10/// - When applied to an enum (which does not contain values)
11/// that enum must be Copy.
12/// - Any derives should be applied **after** the `abstract_bits` macro.
13///
14/// # Example:
15///
16/// ```
17/// #[derive(Debug, Eq, PartialEq, TryFromPrimitive, Clone, Copy)]
18/// #[abstract_bits(bits=2)]
19/// #[repr(u8)]
20/// pub enum NwkRouteRequestManyToOne {
21/// NotManyToOne = 0,
22/// ManyToOneSenderSupportsRouteRecordTable = 1,
23/// ManyToOneSenderDoesntSupportRouteRecordTable = 2,
24/// Reserved = 3,
25/// }
26///
27/// #[abstract_bits]
28/// #[derive(Debug, Clone, PartialEq)]
29/// pub struct NwkRouteRequestCommand {
30/// reserved: u3,
31/// pub many_to_one: NwkRouteRequestManyToOne,
32/// #[abstract_bits(presence_of = destination_eui64)]
33/// reserved: bool,
34/// reserved: u2,
35/// pub route_request_identifier: u8,
36/// pub destination_address: Nwk,
37/// pub path_cost: u8,
38/// pub destination_eui64: Option<Eui64>,
39/// pub tlvs: Vec<u8>,
40/// }
41/// ```
42#[proc_macro_attribute]
43#[proc_macro_error]
44pub fn abstract_bits(
45 attr: proc_macro::TokenStream,
46 item: proc_macro::TokenStream,
47) -> proc_macro::TokenStream {
48 let model = if let Ok(item) = syn::parse::<syn::ItemStruct>(item.clone()) {
49 Model::from_struct(item, attr.into())
50 } else if let Ok(item) = syn::parse::<syn::ItemEnum>(item) {
51 Model::from_enum(item, attr.into())
52 } else {
53 panic!("only enum and (unit)struct are supported")
54 };
55
56 let code = codegen(model);
57 code.into()
58}