1use proc_macro2::TokenStream;
2
3use super::internals::{attr, ctxt};
4use super::scheme_loader;
5
6pub struct IdMacroInput(Vec<attr::LegacyMeta>);
7
8impl syn::parse::Parse for IdMacroInput {
9 fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
10 let items =
11 syn::punctuated::Punctuated::<attr::LegacyMeta, syn::Token!(,)>::parse_terminated(
12 input,
13 )?;
14 Ok(Self(items.into_iter().collect()))
15 }
16}
17
18pub fn impl_id(input: &TokenStream, meta: &IdMacroInput) -> Result<TokenStream, Vec<syn::Error>> {
19 let cx = ctxt::Ctxt::new();
20 let id = match attr::IdMacro::from_ast(&cx, input, &meta.0)
21 .and_then(|attrs| scheme_loader::compute_tl_id(&cx, attrs.id, &attrs.scheme))
22 {
23 Some(attrs) => attrs,
24 None => return Err(cx.check().unwrap_err()),
25 };
26 cx.check()?;
27
28 Ok(format!("0x{id:08x}").parse().unwrap())
29}