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}