Skip to main content

zarrs/array/data_type/
int2.rs

1//! The `int2` data type.
2
3use super::macros::register_data_type_plugin;
4
5/// The `int2` data type.
6#[derive(Debug, Clone, Copy)]
7pub struct Int2DataType;
8register_data_type_plugin!(Int2DataType);
9zarrs_plugin::impl_extension_aliases!(Int2DataType, v3: "int2");
10
11impl zarrs_data_type::DataTypeTraits for Int2DataType {
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_i64()
27            .ok_or(zarrs_data_type::DataTypeFillValueMetadataError)?;
28        // int2 range: -2 to 1
29        if !(-2..=1).contains(&int) {
30            return Err(zarrs_data_type::DataTypeFillValueMetadataError);
31        }
32        #[expect(clippy::cast_possible_truncation)]
33        Ok(zarrs_data_type::FillValue::from(int as i8))
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 = i8::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::<i8>()];
54        &TYPES
55    }
56}
57
58zarrs_data_type::codec_traits::impl_pack_bits_data_type_traits!(Int2DataType, 2, signed, 1);
59zarrs_data_type::codec_traits::impl_bytes_data_type_traits!(Int2DataType, 1);