re_types/datatypes/
class_description_map_elem.rs1#![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#[derive(Clone, Debug, Default, Eq, PartialEq)]
28pub struct ClassDescriptionMapElem {
29 pub class_id: crate::datatypes::ClassId,
31
32 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}