Skip to main content

zarrs/array/data_type/
uint2.rs

1//! The `uint2` data type.
2
3use super::macros::register_data_type_plugin;
4
5/// The `uint2` data type.
6#[derive(Debug, Clone, Copy)]
7pub struct UInt2DataType;
8register_data_type_plugin!(UInt2DataType);
9zarrs_plugin::impl_extension_aliases!(UInt2DataType, v3: "uint2");
10
11impl zarrs_data_type::DataTypeTraits for UInt2DataType {
12    fn configuration(&self, _version: zarrs_plugin::ZarrVersion) -> zarrs_metadata::Configuration {
13        zarrs_metadata::Configuration::default()
14    }
15
16    fn size(&self) -> zarrs_metadata::DataTypeSize {
17        zarrs_metadata::DataTypeSize::Fixed(1)
18    }
19
20    fn fill_value(
21        &self,
22        fill_value_metadata: &zarrs_metadata::FillValueMetadata,
23        _version: zarrs_plugin::ZarrVersion,
24    ) -> Result<zarrs_data_type::FillValue, zarrs_data_type::DataTypeFillValueMetadataError> {
25        let int = fill_value_metadata
26            .as_u64()
27            .ok_or(zarrs_data_type::DataTypeFillValueMetadataError)?;
28        // uint2 range: 0 to 3
29        if int > 3 {
30            return Err(zarrs_data_type::DataTypeFillValueMetadataError);
31        }
32        #[expect(clippy::cast_possible_truncation)]
33        Ok(zarrs_data_type::FillValue::from(int as u8))
34    }
35
36    fn metadata_fill_value(
37        &self,
38        fill_value: &zarrs_data_type::FillValue,
39    ) -> Result<zarrs_metadata::FillValueMetadata, zarrs_data_type::DataTypeFillValueError> {
40        let bytes: [u8; 1] = fill_value
41            .as_ne_bytes()
42            .try_into()
43            .map_err(|_| zarrs_data_type::DataTypeFillValueError)?;
44        let number = u8::from_ne_bytes(bytes);
45        Ok(zarrs_metadata::FillValueMetadata::from(number))
46    }
47
48    fn as_any(&self) -> &dyn std::any::Any {
49        self
50    }
51
52    fn compatible_element_types(&self) -> &'static [std::any::TypeId] {
53        const TYPES: [std::any::TypeId; 1] = [std::any::TypeId::of::<u8>()];
54        &TYPES
55    }
56}
57
58zarrs_data_type::codec_traits::impl_pack_bits_data_type_traits!(UInt2DataType, 2, unsigned, 1);
59zarrs_data_type::codec_traits::impl_bytes_data_type_traits!(UInt2DataType, 1);