azalea_core/
data_registry.rs

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