asnfuzzgen_codecs_derive/
lib.rs

1//! Derive Macros for Rust Structures generated by ASN.1 Compiler
2
3use proc_macro::TokenStream;
4use syn::{parse_macro_input, DeriveInput};
5
6mod attrs;
7
8mod symbol;
9
10mod per;
11
12mod utils;
13
14/// APER Codec Derive Macro support.
15#[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/// UPER Codec Derive Macro support.
29#[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}