rasn_compiler_derive/
lib.rs1extern 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}