aboutsummaryrefslogtreecommitdiff
path: root/azalea-core/src/data_registry.rs
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2025-02-02 21:15:45 +0000
committermat <git@matdoes.dev>2025-02-02 21:15:45 +0000
commitb08d3d55d7351eff6e27a09d732078c038539958 (patch)
tree3d511170be7d46bff418296245f62ebd18065453 /azalea-core/src/data_registry.rs
parentcdb68dfb702f442135dadedc53ce29b1cc2b9c14 (diff)
downloadazalea-drasl-b08d3d55d7351eff6e27a09d732078c038539958.tar.xz
start implementing data driven registries
Diffstat (limited to 'azalea-core/src/data_registry.rs')
-rw-r--r--azalea-core/src/data_registry.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/azalea-core/src/data_registry.rs b/azalea-core/src/data_registry.rs
new file mode 100644
index 00000000..a72d9caf
--- /dev/null
+++ b/azalea-core/src/data_registry.rs
@@ -0,0 +1,27 @@
+use std::str::FromStr;
+
+use azalea_registry::DataRegistry;
+use simdnbt::owned::NbtCompound;
+
+use crate::{registry_holder::RegistryHolder, resource_location::ResourceLocation};
+
+pub trait ResolvableDataRegistry: DataRegistry {
+ fn resolve_name(&self, registries: &RegistryHolder) -> Option<ResourceLocation> {
+ self.resolve(registries).map(|(name, _)| name.clone())
+ }
+ fn resolve<'a>(
+ &self,
+ registries: &'a RegistryHolder,
+ ) -> Option<(&'a ResourceLocation, &'a NbtCompound)> {
+ let name_resourcelocation = ResourceLocation::from_str(Self::NAME).unwrap_or_else(|_| {
+ panic!(
+ "Name for registry should be a valid ResourceLocation: {}",
+ Self::NAME
+ )
+ });
+ let registry_values = registries.map.get(&name_resourcelocation)?;
+ let resolved = registry_values.get_index(self.protocol_id() as usize)?;
+ Some(resolved)
+ }
+}
+impl<T: DataRegistry> ResolvableDataRegistry for T {}