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}