Skip to main content

skyblock_repo_macros/
lib.rs

1use 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}