skyblock_repo_macros/
lib.rs1use heck::ToPascalCase;
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{DeriveInput, Ident, parse_macro_input};
5
6#[proc_macro]
7pub fn getter(input: TokenStream) -> TokenStream {
8 let ident = parse_macro_input!(input as Ident);
9 let base = ident.to_string();
10
11 let pascal = base.to_pascal_case();
12 let plural = format!("{base}s");
13 let method = format!("get_{base}_by_id");
14
15 let pascal_ident = syn::Ident::new(&format!("Skyblock{pascal}"), ident.span());
16 let plural_ident = syn::Ident::new(&plural, ident.span());
17 let method_ident = syn::Ident::new(&method, ident.span());
18
19 let expanded = quote! {
20 #[doc = concat!("Retrieves a `", stringify!($name), "` by its `internalId`.")]
21 #[must_use]
22 #[inline]
23 pub fn #method_ident(&self, id: &str) -> Option<#pascal_ident> {
24 self.#plural_ident.get(&id.to_uppercase()).cloned()
25 }
26 };
27
28 expanded.into()
29}
30
31#[proc_macro_derive(PyStr)]
32pub fn derive_pystr(input: TokenStream) -> TokenStream {
33 let input = parse_macro_input!(input as DeriveInput);
34 let name = &input.ident;
35
36 let expanded = quote! {
37 #[pymethods]
38 impl #name {
39 fn __str__(&self) -> String {
40 serde_json::to_string(self).unwrap()
41 }
42 }
43 };
44
45 expanded.into()
46}