Files
Pumpkin/pumpkin-codegen/src/data_component.rs
Alexander Medvedev 2fcc9bcf4a chore: enforce some more clippy lints
pumpkin contributors will love me :cap:
2026-05-20 22:27:54 +02:00

91 lines
2.5 KiB
Rust

use heck::ToPascalCase;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use std::collections::BTreeMap;
use std::fs;
/// Generates the `TokenStream` for the `DataComponent` enum and its ID/name conversion methods.
pub fn build() -> TokenStream {
let data_component: BTreeMap<String, u8> =
serde_json::from_str(&fs::read_to_string("../assets/data_component.json").unwrap())
.expect("Failed to parse data_component.json");
let mut enum_variants = TokenStream::new();
let mut id_to_enum = TokenStream::new();
let mut enum_to_name = TokenStream::new();
let mut name_to_enum = TokenStream::new();
let mut data_component_vec = data_component.iter().collect::<Vec<_>>();
data_component_vec.sort_by_key(|(_, i)| **i);
for (raw_name, raw_value) in &data_component_vec {
let strip_name = raw_name
.strip_prefix("minecraft:")
.unwrap()
.replace('/', "_");
let pascal_case = format_ident!("{}", strip_name.to_pascal_case());
// Enum variant
enum_variants.extend(quote! {
#pascal_case = #raw_value,
});
id_to_enum.extend(quote! {
#raw_value => Some(Self::#pascal_case),
});
// TODO use phf
name_to_enum.extend(quote! {
#raw_name => Some(Self::#pascal_case),
});
// Enum -> &str
enum_to_name.extend(quote! {
Self::#pascal_case => #raw_name,
});
}
quote! {
use crate::data_component_impl::*;
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
#[repr(u8)]
pub enum DataComponent {
#enum_variants
}
impl DataComponent {
#[must_use]
pub const fn to_id(self) -> u8 {
self as u8
}
#[must_use]
#[allow(clippy::too_many_lines)]
pub const fn try_from_id(id: u8) -> Option<Self> {
match id {
#id_to_enum
_ => None,
}
}
#[must_use]
#[allow(clippy::too_many_lines)]
pub fn try_from_name(name: &str) -> Option<Self> {
match name {
#name_to_enum
_ => None,
}
}
#[must_use]
#[allow(clippy::too_many_lines)]
pub const fn to_name(self) -> &'static str {
match self {
#enum_to_name
}
}
}
}
}