centaurus-derive 0.1.2

A utility library for various use cases.
Documentation
use proc_macro::TokenStream;
use quote::quote;
use syn::{DeriveInput, Expr, parse_macro_input};

use crate::centaurus_path;

pub fn settings(input: TokenStream) -> TokenStream {
  let input = parse_macro_input!(input as DeriveInput);
  let name = input.ident.clone();

  let mut id_value = None;

  for attr in &input.attrs {
    if attr.path().is_ident("settings")
      && let Err(e) = attr.parse_nested_meta(|meta| {
        if meta.path.is_ident("id") {
          let value: Expr = meta.value()?.parse()?;
          id_value = Some(quote! { #value });
          Ok(())
        } else {
          Err(meta.error("Unknown attribute in #[settings]: expected 'id'"))
        }
      })
    {
      return e.to_compile_error().into();
    }
  }

  let path = centaurus_path();
  quote! {
    impl #path::db::settings::Settings for #name {
      fn id() -> i32 {
        #id_value
      }
    }
  }
  .into()
}