From 7b205fe10824dfb0cd511d2fdd1168415c1a25ff Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Fri, 10 Jan 2025 14:57:06 +0100 Subject: [PATCH] remove build from gitignore --- .gitignore | 1 - pumpkin-data/build/build.rs | 37 +++++++++++++++++++++++++ pumpkin-data/build/packet.rs | 50 ++++++++++++++++++++++++++++++++++ pumpkin-data/build/particle.rs | 29 ++++++++++++++++++++ pumpkin-data/build/screen.rs | 29 ++++++++++++++++++++ pumpkin-data/build/sound.rs | 29 ++++++++++++++++++++ 6 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 pumpkin-data/build/build.rs create mode 100644 pumpkin-data/build/packet.rs create mode 100644 pumpkin-data/build/particle.rs create mode 100644 pumpkin-data/build/screen.rs create mode 100644 pumpkin-data/build/sound.rs diff --git a/.gitignore b/.gitignore index 4b08876e5..9feb853cd 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,6 @@ Temporary Items ## Java/Gradle Stuff .gradle -**/build/ !src/**/build/ .kotlin diff --git a/pumpkin-data/build/build.rs b/pumpkin-data/build/build.rs new file mode 100644 index 000000000..118e449da --- /dev/null +++ b/pumpkin-data/build/build.rs @@ -0,0 +1,37 @@ +use std::{env, fs, path::Path, process::Command}; + +use proc_macro2::{Span, TokenStream}; +use syn::Ident; + +mod packet; +mod particle; +mod screen; +mod sound; + +pub fn main() { + write_generated_file(packet::build(), "packet.rs"); + write_generated_file(screen::build(), "screen.rs"); + write_generated_file(particle::build(), "particle.rs"); + write_generated_file(sound::build(), "sound.rs"); +} + +pub fn write_generated_file(content: TokenStream, out_file: &str) { + let out_dir = env::var_os("OUT_DIR").expect("failed to get OUT_DIR env var"); + let path = Path::new(&out_dir).join(out_file); + let code = content.to_string(); + + fs::write(&path, code).expect("Faile to write to fs"); + + // Try to format the output for debugging purposes. + // Doesn't matter if rustfmt is unavailable. + let _ = Command::new("rustfmt").arg(path).output(); +} + +pub fn ident>(s: I) -> Ident { + let s = s.as_ref().trim(); + + // Parse the ident from a str. If the string is a Rust keyword, stick an + // underscore in front. + syn::parse_str::(s) + .unwrap_or_else(|_| Ident::new(format!("_{s}").as_str(), Span::call_site())) +} diff --git a/pumpkin-data/build/packet.rs b/pumpkin-data/build/packet.rs new file mode 100644 index 000000000..3692d32b9 --- /dev/null +++ b/pumpkin-data/build/packet.rs @@ -0,0 +1,50 @@ +use std::collections::HashMap; + +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; + +use crate::ident; + +#[derive(Deserialize)] +pub struct Packets { + serverbound: HashMap>, + clientbound: HashMap>, +} + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/packets.json"); + + let packets: Packets = serde_json::from_str(include_str!("../../assets/packets.json")) + .expect("Failed to parse packets.json"); + let serverbound_consts = parse_packets(packets.serverbound); + let clientbound_consts = parse_packets(packets.clientbound); + + quote!( + pub mod serverbound { + #serverbound_consts + } + + pub mod clientbound { + #clientbound_consts + } + ) +} + +pub(crate) fn parse_packets(packets: HashMap>) -> proc_macro2::TokenStream { + let mut consts = TokenStream::new(); + + for packet in packets { + let phase = packet.0; + + for (id, packet_name) in packet.1.iter().enumerate() { + let packet_id = id as i32; + let name = format!("{phase}_{packet_name}").to_uppercase(); + let name = ident(name); + consts.extend([quote! { + pub const #name: i32 = #packet_id; + }]); + } + } + consts +} diff --git a/pumpkin-data/build/particle.rs b/pumpkin-data/build/particle.rs new file mode 100644 index 000000000..d81f3d336 --- /dev/null +++ b/pumpkin-data/build/particle.rs @@ -0,0 +1,29 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; + +use crate::ident; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/particles.json"); + + let screens: Vec = serde_json::from_str(include_str!("../../assets/particles.json")) + .expect("Failed to parse particles.json"); + let mut variants = TokenStream::new(); + + for (id, screen) in screens.iter().enumerate() { + let id = id as u8; + let name = ident(screen.to_pascal_case()); + + variants.extend([quote! { + #name = #id, + }]); + } + quote! { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + #[repr(u8)] + pub enum Particle { + #variants + } + } +} diff --git a/pumpkin-data/build/screen.rs b/pumpkin-data/build/screen.rs new file mode 100644 index 000000000..a029b14b0 --- /dev/null +++ b/pumpkin-data/build/screen.rs @@ -0,0 +1,29 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; + +use crate::ident; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/screens.json"); + + let screens: Vec = serde_json::from_str(include_str!("../../assets/screens.json")) + .expect("Failed to parse screens.json"); + let mut variants = TokenStream::new(); + + for (id, screen) in screens.iter().enumerate() { + let id = id as u8; + let name = ident(screen.to_pascal_case()); + + variants.extend([quote! { + #name = #id, + }]); + } + quote! { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + #[repr(u8)] + pub enum WindowType { + #variants + } + } +} diff --git a/pumpkin-data/build/sound.rs b/pumpkin-data/build/sound.rs new file mode 100644 index 000000000..996cbe20a --- /dev/null +++ b/pumpkin-data/build/sound.rs @@ -0,0 +1,29 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; + +use crate::ident; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/sounds.json"); + + let screens: Vec = serde_json::from_str(include_str!("../../assets/sounds.json")) + .expect("Failed to parse sounds.json"); + let mut variants = TokenStream::new(); + + for (id, screen) in screens.iter().enumerate() { + let id = id as u16; + let name = ident(screen.to_pascal_case()); + + variants.extend([quote! { + #name = #id, + }]); + } + quote! { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + #[repr(u16)] + pub enum Sound { + #variants + } + } +}