43 lines
1.5 KiB
Rust
Raw Normal View History

2022-11-27 18:21:50 +01:00
use quote::{format_ident, quote, ToTokens};
2023-07-03 00:42:20 +02:00
use syn::{parse_macro_input, ItemConst, LitStr};
2022-11-27 18:21:50 +01:00
2022-11-27 17:05:30 +01:00
#[proc_macro_attribute]
2022-11-27 18:47:02 +01:00
pub fn resultcode(
2022-11-27 18:21:50 +01:00
args: proc_macro::TokenStream,
2022-11-27 17:05:30 +01:00
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
2023-07-03 00:42:20 +02:00
// Handle attributes first.
let mut info_str: Option<LitStr> = None;
let res_code_parser = syn::meta::parser(|meta| {
if meta.path.is_ident("info") {
info_str = Some(meta.value()?.parse()?);
Ok(())
} else {
Err(meta.error("unsupported property for resultcode attribute"))
2022-11-27 18:21:50 +01:00
}
2023-07-03 00:42:20 +02:00
});
parse_macro_input!(args with res_code_parser);
let item = parse_macro_input!(item as ItemConst);
2022-11-27 18:21:50 +01:00
2023-07-03 00:42:20 +02:00
// Generate additional generated info struct used for introspection.
2023-07-05 11:25:23 +02:00
let result_code_name = &item.ident;
2023-07-03 00:42:20 +02:00
let name_as_str = result_code_name.to_string();
let gen_struct_name = format_ident!("{}_EXT", result_code_name);
let info_str = info_str.map_or(String::from(""), |v| v.value());
// TODO: Group string
let generated_struct = quote! {
const #gen_struct_name: satrs_mib::res_code::ResultU16Info =
satrs_mib::res_code::ResultU16Info::const_new(
#name_as_str,
&#result_code_name,
"",
#info_str
);
};
2022-11-27 18:21:50 +01:00
2023-07-03 00:42:20 +02:00
// The input constant returncode is written to the output in any case.
let mut output = item.to_token_stream();
output.extend(generated_struct);
output.into()
2022-11-27 17:05:30 +01:00
}