kfl_derive/
lib.rs

1#![no_std]
2extern crate alloc;
3
4mod definition;
5mod kw;
6mod new_type;
7mod node;
8mod scalar;
9mod variants;
10
11use alloc::{format, string::String};
12use definition::Definition;
13use proc_macro::TokenStream;
14use scalar::{Scalar, emit_decode_scalar, emit_encode_scalar};
15
16type EmitResult = syn::Result<proc_macro2::TokenStream>;
17
18fn emit_decode(def: &Definition) -> EmitResult {
19    match def {
20        Definition::Struct(s) => node::emit_decode_struct(s, true, false),
21        Definition::NewType(s) => new_type::emit_new_type(s),
22        Definition::TupleStruct(s) => node::emit_decode_struct(s, false, false),
23        Definition::UnitStruct(s) => node::emit_decode_struct(s, true, false),
24        Definition::Enum(e) => variants::emit_decode_enum(e),
25    }
26}
27
28fn emit_decode_partial(def: &Definition) -> EmitResult {
29    match def {
30        Definition::Struct(s) => node::emit_decode_struct(s, true, true),
31        Definition::NewType(_) => todo!(),
32        Definition::TupleStruct(s) => node::emit_decode_struct(s, false, true),
33        Definition::UnitStruct(s) => node::emit_decode_struct(s, true, true),
34        Definition::Enum(_) => todo!(),
35    }
36}
37
38fn emit_encode(def: &Definition) -> EmitResult {
39    match def {
40        Definition::Struct(s) => node::emit_encode_struct(s, false),
41        Definition::NewType(_) => todo!(),
42        Definition::TupleStruct(s) => node::emit_encode_struct(s, false),
43        Definition::UnitStruct(s) => node::emit_encode_struct(s, false),
44        Definition::Enum(e) => variants::emit_encode_enum(e),
45    }
46}
47
48fn emit_encode_partial(def: &Definition) -> EmitResult {
49    match def {
50        Definition::Struct(s) => node::emit_encode_struct(s, true),
51        Definition::NewType(_) => todo!(),
52        Definition::TupleStruct(s) => node::emit_encode_struct(s, true),
53        Definition::UnitStruct(s) => node::emit_encode_struct(s, true),
54        Definition::Enum(_) => todo!(),
55    }
56}
57
58#[proc_macro_derive(Decode, attributes(kfl))]
59pub fn decode_derive(input: TokenStream) -> TokenStream {
60    let item = syn::parse_macro_input!(input as Definition);
61    match emit_decode(&item) {
62        Ok(stream) => stream.into(),
63        Err(e) => e.to_compile_error().into(),
64    }
65}
66
67#[proc_macro_derive(DecodePartial, attributes(kfl))]
68pub fn decode_partial_derive(input: TokenStream) -> TokenStream {
69    let item = syn::parse_macro_input!(input as Definition);
70    match emit_decode_partial(&item) {
71        Ok(stream) => stream.into(),
72        Err(e) => e.to_compile_error().into(),
73    }
74}
75
76#[proc_macro_derive(DecodeScalar, attributes(kfl))]
77pub fn decode_scalar_derive(input: TokenStream) -> TokenStream {
78    let item = syn::parse_macro_input!(input as Scalar);
79    match emit_decode_scalar(&item) {
80        Ok(stream) => stream.into(),
81        Err(e) => e.to_compile_error().into(),
82    }
83}
84
85#[proc_macro_derive(Encode, attributes(kfl))]
86pub fn encode_derive(input: TokenStream) -> TokenStream {
87    let item = syn::parse_macro_input!(input as Definition);
88    match emit_encode(&item) {
89        Ok(stream) => stream.into(),
90        Err(e) => e.to_compile_error().into(),
91    }
92}
93
94#[proc_macro_derive(EncodePartial, attributes(kfl))]
95pub fn encode_partial_derive(input: TokenStream) -> TokenStream {
96    let item = syn::parse_macro_input!(input as Definition);
97    match emit_encode_partial(&item) {
98        Ok(stream) => stream.into(),
99        Err(e) => e.to_compile_error().into(),
100    }
101}
102
103#[proc_macro_derive(EncodeScalar, attributes(kfl))]
104pub fn encode_scalar_derive(input: TokenStream) -> TokenStream {
105    let item = syn::parse_macro_input!(input as Scalar);
106    match emit_encode_scalar(&item) {
107        Ok(stream) => stream.into(),
108        Err(e) => e.to_compile_error().into(),
109    }
110}
111
112pub(crate) fn to_kebab_case(ident: &syn::Ident) -> String {
113    heck::ToKebabCase::to_kebab_case(format!("{}", ident).as_str())
114}