asnfuzzgen_codecs_derive/
lib.rs1use proc_macro::TokenStream;
4use syn::{parse_macro_input, DeriveInput};
5
6mod attrs;
7
8mod symbol;
9
10mod per;
11
12mod utils;
13
14#[proc_macro_derive(AperCodec, attributes(asn))]
16pub fn derive_aper_codec(input: TokenStream) -> TokenStream {
17 let ast = parse_macro_input!(input as DeriveInput);
18
19 let codec_params = codec_params_or_err(&ast);
20 if codec_params.is_err() {
21 codec_params.err().unwrap().to_compile_error().into()
22 } else {
23 let codec_params = codec_params.unwrap();
24 per::generate_codec(&ast, &codec_params, true)
25 }
26}
27
28#[proc_macro_derive(UperCodec, attributes(asn))]
30pub fn derive_uper_codec(input: TokenStream) -> TokenStream {
31 let ast = parse_macro_input!(input as DeriveInput);
32
33 let codec_params = codec_params_or_err(&ast);
34 if codec_params.is_err() {
35 codec_params.err().unwrap().to_compile_error().into()
36 } else {
37 let codec_params = codec_params.unwrap();
38 per::generate_codec(&ast, &codec_params, false)
39 }
40}
41
42fn codec_params_or_err(ast: &DeriveInput) -> Result<attrs::TyCodecParams, syn::Error> {
43 let codec_params = attrs::parse_ty_meta_as_codec_params(&ast.attrs);
44 if codec_params.is_err() {
45 return Err(codec_params.err().unwrap());
46 }
47
48 let codec_params = codec_params.unwrap();
49 if codec_params.attr.is_none() {
50 return Err(syn::Error::new_spanned(
51 ast,
52 "Missing attribute 'asn' for the struct.",
53 ));
54 }
55
56 if codec_params.ty.is_none() {
57 return Err(syn::Error::new_spanned(
58 codec_params.attr,
59 "Missing parameter 'type' for the attribute.",
60 ));
61 }
62
63 Ok(codec_params)
64}