rasn_compiler_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use rasn_compiler::prelude::RasnBackend;
5use syn::{parse::Parse, parse_macro_input, LitStr};
6
7const DUMMY_HEADER: &str = r#"asn1 { dummy(999) header(999) }
8
9DEFINITIONS AUTOMATIC TAGS::= BEGIN
10"#;
11const DUMMY_FOOTER: &str = r#"END"#;
12
13struct MacroInput {
14    asn: LitStr,
15}
16
17impl Parse for MacroInput {
18    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
19        Ok(Self {
20            asn: input.parse()?,
21        })
22    }
23}
24
25#[proc_macro]
26pub fn asn1(input: TokenStream) -> TokenStream {
27    let config = parse_macro_input!(input as MacroInput);
28
29    let literal_asn1 = match config.asn.value() {
30        v if v.contains("BEGIN") => v,
31        v => String::from(DUMMY_HEADER) + &v + DUMMY_FOOTER,
32    };
33
34    rasn_compiler::Compiler::<RasnBackend, _>::new()
35        .add_asn_literal(literal_asn1)
36        .compile_to_string()
37        .unwrap()
38        .generated
39        .parse()
40        .unwrap()
41}