konfig_rust_derive/
lib.rs1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{DeriveInput, parse_macro_input};
6
7#[proc_macro_derive(KonfigSection)]
8pub fn konfig_section_derive(input: TokenStream) -> TokenStream {
9 let input = parse_macro_input!(input as DeriveInput);
10 let name = input.ident;
11
12 let expanded = quote! {
13 impl KonfigSection for #name {
14 fn name(&self) -> std::borrow::Cow<'_, str> {
15 std::borrow::Cow::Borrowed(stringify!(#name))
16 }
17 fn validate(&self) -> Result<(), KonfigError> { Ok(()) }
18 fn on_load(&self) -> Result<(), KonfigError> { Ok(()) }
19 fn to_bytes(&self, format: &FormatHandlerEnum) -> Result<Vec<u8>, KonfigError> {
20 format.marshal(self)
21 }
22 fn update_from_bytes(&mut self, bytes: &[u8], format: &FormatHandlerEnum) -> Result<(), KonfigError> {
23 let new_instance: #name = match format {
24 FormatHandlerEnum::JSON(_) => {
25 serde_json::from_slice(bytes)
26 .map_err(|err| KonfigError::UnmarshalError(err.to_string()))?
27 },
28 FormatHandlerEnum::YAML(_) => {
29 serde_yaml::from_slice(bytes)
30 .map_err(|err| KonfigError::UnmarshalError(err.to_string()))?
31 },
32 FormatHandlerEnum::TOML(_) => {
33 let s = std::str::from_utf8(bytes)
34 .map_err(|err| KonfigError::UnmarshalError(err.to_string()))?;
35 toml::from_str(s)
36 .map_err(|err| KonfigError::UnmarshalError(err.to_string()))?
37 },
38 };
39
40 *self = new_instance;
41 Ok(())
42 }
43 }
44 };
45
46 TokenStream::from(expanded)
47}