azalea_core/
data_registry.rs1use std::{io::Cursor, str::FromStr};
2
3use azalea_registry::DataRegistry;
4use simdnbt::owned::NbtCompound;
5
6use crate::{registry_holder::RegistryHolder, resource_location::ResourceLocation};
7
8pub trait ResolvableDataRegistry: DataRegistry {
9 fn resolve_name(&self, registries: &RegistryHolder) -> Option<ResourceLocation> {
10 self.resolve(registries).map(|(name, _)| name.clone())
11 }
12 fn resolve<'a>(
13 &self,
14 registries: &'a RegistryHolder,
15 ) -> Option<(&'a ResourceLocation, &'a NbtCompound)> {
16 let name_resourcelocation = ResourceLocation::from_str(Self::NAME).unwrap_or_else(|_| {
17 panic!(
18 "Name for registry should be a valid ResourceLocation: {}",
19 Self::NAME
20 )
21 });
22 let registry_values = registries.map.get(&name_resourcelocation)?;
23 let resolved = registry_values.get_index(self.protocol_id() as usize)?;
24 Some(resolved)
25 }
26
27 fn resolve_and_deserialize<T: simdnbt::Deserialize>(
28 &self,
29 registries: &RegistryHolder,
30 ) -> Option<Result<(ResourceLocation, T), simdnbt::DeserializeError>> {
31 let (name, value) = self.resolve(registries)?;
32
33 let mut nbt_bytes = Vec::new();
34 value.write(&mut nbt_bytes);
35 let nbt_borrow_compound =
36 simdnbt::borrow::read_compound(&mut Cursor::new(&nbt_bytes)).ok()?;
37 let value = match T::from_compound((&nbt_borrow_compound).into()) {
38 Ok(value) => value,
39 Err(err) => {
40 return Some(Err(err));
41 }
42 };
43
44 Some(Ok((name.clone(), value)))
45 }
46}
47impl<T: DataRegistry> ResolvableDataRegistry for T {}