ferrishot_knus_derive/
lib.rs

1use proc_macro2::TokenStream;
2
3mod definition;
4mod kw;
5mod node;
6mod scalar;
7mod variants;
8
9use definition::Definition;
10use scalar::{emit_scalar, Scalar};
11
12fn emit_decoder(def: &Definition) -> syn::Result<TokenStream> {
13    match def {
14        Definition::Struct(s) => node::emit_struct(s, true),
15        Definition::NewType(s) => node::emit_new_type(s),
16        Definition::TupleStruct(s) => node::emit_struct(s, false),
17        Definition::UnitStruct(s) => node::emit_struct(s, true),
18        Definition::Enum(e) => variants::emit_enum(e),
19    }
20}
21
22#[proc_macro_error2::proc_macro_error]
23#[proc_macro_derive(Decode, attributes(ferrishot_knus))]
24#[doc = include_str!("../derive_decode.md")]
25pub fn decode_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
26    let item = syn::parse_macro_input!(input as Definition);
27    match emit_decoder(&item) {
28        Ok(stream) => stream.into(),
29        Err(e) => e.to_compile_error().into(),
30    }
31}
32
33#[proc_macro_error2::proc_macro_error]
34#[proc_macro_derive(DecodeScalar, attributes(ferrishot_knus))]
35#[doc = include_str!("../derive_decode_scalar.md")]
36pub fn decode_scalar_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
37    let item = syn::parse_macro_input!(input as Scalar);
38    match emit_scalar(&item) {
39        Ok(stream) => stream.into(),
40        Err(e) => e.to_compile_error().into(),
41    }
42}