re_types/datatypes/
class_description_map_elem.rs

1// DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/rust/api.rs
2// Based on "crates/store/re_types/definitions/rerun/datatypes/class_description_map_elem.fbs".
3
4#![allow(unused_braces)]
5#![allow(unused_imports)]
6#![allow(unused_parens)]
7#![allow(clippy::clone_on_copy)]
8#![allow(clippy::cloned_instead_of_copied)]
9#![allow(clippy::map_flatten)]
10#![allow(clippy::needless_question_mark)]
11#![allow(clippy::new_without_default)]
12#![allow(clippy::redundant_closure)]
13#![allow(clippy::too_many_arguments)]
14#![allow(clippy::too_many_lines)]
15
16use ::re_types_core::try_serialize_field;
17use ::re_types_core::SerializationResult;
18use ::re_types_core::{ComponentBatch as _, SerializedComponentBatch};
19use ::re_types_core::{ComponentDescriptor, ComponentType};
20use ::re_types_core::{DeserializationError, DeserializationResult};
21
22/// **Datatype**: A helper type for mapping [`datatypes::ClassId`][crate::datatypes::ClassId]s to class descriptions.
23///
24/// This is internal to [`components::AnnotationContext`][crate::components::AnnotationContext].
25///
26/// ⚠️ **This type is _unstable_ and may change significantly in a way that the data won't be backwards compatible.**
27#[derive(Clone, Debug, Default, Eq, PartialEq)]
28pub struct ClassDescriptionMapElem {
29    /// The key: the [`components::ClassId`][crate::components::ClassId].
30    pub class_id: crate::datatypes::ClassId,
31
32    /// The value: class name, color, etc.
33    pub class_description: crate::datatypes::ClassDescription,
34}
35
36::re_types_core::macros::impl_into_cow!(ClassDescriptionMapElem);
37
38impl ::re_types_core::Loggable for ClassDescriptionMapElem {
39    #[inline]
40    fn arrow_datatype() -> arrow::datatypes::DataType {
41        #![allow(clippy::wildcard_imports)]
42        use arrow::datatypes::*;
43        DataType::Struct(Fields::from(vec![
44            Field::new(
45                "class_id",
46                <crate::datatypes::ClassId>::arrow_datatype(),
47                false,
48            ),
49            Field::new(
50                "class_description",
51                <crate::datatypes::ClassDescription>::arrow_datatype(),
52                false,
53            ),
54        ]))
55    }
56
57    fn to_arrow_opt<'a>(
58        data: impl IntoIterator<Item = Option<impl Into<::std::borrow::Cow<'a, Self>>>>,
59    ) -> SerializationResult<arrow::array::ArrayRef>
60    where
61        Self: Clone + 'a,
62    {
63        #![allow(clippy::wildcard_imports)]
64        #![allow(clippy::manual_is_variant_and)]
65        use ::re_types_core::{arrow_helpers::as_array_ref, Loggable as _, ResultExt as _};
66        use arrow::{array::*, buffer::*, datatypes::*};
67        Ok({
68            let fields = Fields::from(vec![
69                Field::new(
70                    "class_id",
71                    <crate::datatypes::ClassId>::arrow_datatype(),
72                    false,
73                ),
74                Field::new(
75                    "class_description",
76                    <crate::datatypes::ClassDescription>::arrow_datatype(),
77                    false,
78                ),
79            ]);
80            let (somes, data): (Vec<_>, Vec<_>) = data
81                .into_iter()
82                .map(|datum| {
83                    let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into);
84                    (datum.is_some(), datum)
85                })
86                .unzip();
87            let validity: Option<arrow::buffer::NullBuffer> = {
88                let any_nones = somes.iter().any(|some| !*some);
89                any_nones.then(|| somes.into())
90            };
91            as_array_ref(StructArray::new(
92                fields,
93                vec![
94                    {
95                        let (somes, class_id): (Vec<_>, Vec<_>) = data
96                            .iter()
97                            .map(|datum| {
98                                let datum = datum.as_ref().map(|datum| datum.class_id.clone());
99                                (datum.is_some(), datum)
100                            })
101                            .unzip();
102                        let class_id_validity: Option<arrow::buffer::NullBuffer> = {
103                            let any_nones = somes.iter().any(|some| !*some);
104                            any_nones.then(|| somes.into())
105                        };
106                        as_array_ref(PrimitiveArray::<UInt16Type>::new(
107                            ScalarBuffer::from(
108                                class_id
109                                    .into_iter()
110                                    .map(|datum| datum.map(|datum| datum.0).unwrap_or_default())
111                                    .collect::<Vec<_>>(),
112                            ),
113                            class_id_validity,
114                        ))
115                    },
116                    {
117                        let (somes, class_description): (Vec<_>, Vec<_>) = data
118                            .iter()
119                            .map(|datum| {
120                                let datum =
121                                    datum.as_ref().map(|datum| datum.class_description.clone());
122                                (datum.is_some(), datum)
123                            })
124                            .unzip();
125                        let class_description_validity: Option<arrow::buffer::NullBuffer> = {
126                            let any_nones = somes.iter().any(|some| !*some);
127                            any_nones.then(|| somes.into())
128                        };
129                        {
130                            _ = class_description_validity;
131                            crate::datatypes::ClassDescription::to_arrow_opt(class_description)?
132                        }
133                    },
134                ],
135                validity,
136            ))
137        })
138    }
139
140    fn from_arrow_opt(
141        arrow_data: &dyn arrow::array::Array,
142    ) -> DeserializationResult<Vec<Option<Self>>>
143    where
144        Self: Sized,
145    {
146        #![allow(clippy::wildcard_imports)]
147        use ::re_types_core::{arrow_zip_validity::ZipValidity, Loggable as _, ResultExt as _};
148        use arrow::{array::*, buffer::*, datatypes::*};
149        Ok({
150            let arrow_data = arrow_data
151                .as_any()
152                .downcast_ref::<arrow::array::StructArray>()
153                .ok_or_else(|| {
154                    let expected = Self::arrow_datatype();
155                    let actual = arrow_data.data_type().clone();
156                    DeserializationError::datatype_mismatch(expected, actual)
157                })
158                .with_context("rerun.datatypes.ClassDescriptionMapElem")?;
159            if arrow_data.is_empty() {
160                Vec::new()
161            } else {
162                let (arrow_data_fields, arrow_data_arrays) =
163                    (arrow_data.fields(), arrow_data.columns());
164                let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields
165                    .iter()
166                    .map(|field| field.name().as_str())
167                    .zip(arrow_data_arrays)
168                    .collect();
169                let class_id = {
170                    if !arrays_by_name.contains_key("class_id") {
171                        return Err(DeserializationError::missing_struct_field(
172                            Self::arrow_datatype(),
173                            "class_id",
174                        ))
175                        .with_context("rerun.datatypes.ClassDescriptionMapElem");
176                    }
177                    let arrow_data = &**arrays_by_name["class_id"];
178                    arrow_data
179                        .as_any()
180                        .downcast_ref::<UInt16Array>()
181                        .ok_or_else(|| {
182                            let expected = DataType::UInt16;
183                            let actual = arrow_data.data_type().clone();
184                            DeserializationError::datatype_mismatch(expected, actual)
185                        })
186                        .with_context("rerun.datatypes.ClassDescriptionMapElem#class_id")?
187                        .into_iter()
188                        .map(|res_or_opt| res_or_opt.map(crate::datatypes::ClassId))
189                };
190                let class_description = {
191                    if !arrays_by_name.contains_key("class_description") {
192                        return Err(DeserializationError::missing_struct_field(
193                            Self::arrow_datatype(),
194                            "class_description",
195                        ))
196                        .with_context("rerun.datatypes.ClassDescriptionMapElem");
197                    }
198                    let arrow_data = &**arrays_by_name["class_description"];
199                    crate::datatypes::ClassDescription::from_arrow_opt(arrow_data)
200                        .with_context("rerun.datatypes.ClassDescriptionMapElem#class_description")?
201                        .into_iter()
202                };
203                ZipValidity::new_with_validity(
204                    ::itertools::izip!(class_id, class_description),
205                    arrow_data.nulls(),
206                )
207                .map(|opt| {
208                    opt.map(|(class_id, class_description)| {
209                        Ok(Self {
210                            class_id: class_id
211                                .ok_or_else(DeserializationError::missing_data)
212                                .with_context("rerun.datatypes.ClassDescriptionMapElem#class_id")?,
213                            class_description: class_description
214                                .ok_or_else(DeserializationError::missing_data)
215                                .with_context(
216                                    "rerun.datatypes.ClassDescriptionMapElem#class_description",
217                                )?,
218                        })
219                    })
220                    .transpose()
221                })
222                .collect::<DeserializationResult<Vec<_>>>()
223                .with_context("rerun.datatypes.ClassDescriptionMapElem")?
224            }
225        })
226    }
227}
228
229impl ::re_byte_size::SizeBytes for ClassDescriptionMapElem {
230    #[inline]
231    fn heap_size_bytes(&self) -> u64 {
232        self.class_id.heap_size_bytes() + self.class_description.heap_size_bytes()
233    }
234
235    #[inline]
236    fn is_pod() -> bool {
237        <crate::datatypes::ClassId>::is_pod() && <crate::datatypes::ClassDescription>::is_pod()
238    }
239}