in src/serialize/per_type/numpy.rs [312:404]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
if self.is_zero_dimensional {
// For zero-dimensional arrays, serialize the single value directly
match self.kind {
ItemType::F64 => DataTypeF64 { obj: unsafe { *(self.data() as *const f64) } }.serialize(serializer),
ItemType::F32 => DataTypeF32 { obj: unsafe { *(self.data() as *const f32) } }.serialize(serializer),
ItemType::F16 => DataTypeF16 { obj: unsafe { *(self.data() as *const u16) } }.serialize(serializer),
ItemType::U64 => DataTypeU64 { obj: unsafe { *(self.data() as *const u64) } }.serialize(serializer),
ItemType::U32 => DataTypeU32 { obj: unsafe { *(self.data() as *const u32) } }.serialize(serializer),
ItemType::U16 => DataTypeU16 { obj: unsafe { *(self.data() as *const u16) } }.serialize(serializer),
ItemType::U8 => DataTypeU8 { obj: unsafe { *(self.data() as *const u8) } }.serialize(serializer),
ItemType::I64 => DataTypeI64 { obj: unsafe { *(self.data() as *const i64) } }.serialize(serializer),
ItemType::I32 => DataTypeI32 { obj: unsafe { *(self.data() as *const i32) } }.serialize(serializer),
ItemType::I16 => DataTypeI16 { obj: unsafe { *(self.data() as *const i16) } }.serialize(serializer),
ItemType::I8 => DataTypeI8 { obj: unsafe { *(self.data() as *const i8) } }.serialize(serializer),
ItemType::BOOL => DataTypeBool { obj: unsafe { *(self.data() as *const u8) } }.serialize(serializer),
ItemType::DATETIME64(unit) => {
let val = unsafe { *(self.data() as *const i64) };
unit.datetime(val, self.opts)
.map_err(NumpyDateTimeError::into_serde_err)?
.serialize(serializer)
},
}
} else if unlikely!(!(self.depth >= self.dimensions() || self.shape()[self.depth] != 0)) {
ZeroListSerializer::new().serialize(serializer)
} else if !self.children.is_empty() {
let mut seq = serializer.serialize_seq(None).unwrap();
for child in &self.children {
seq.serialize_element(child).unwrap();
}
seq.end()
} else {
match self.kind {
ItemType::F64 => {
NumpyF64Array::new(slice!(self.data() as *const f64, self.num_items()))
.serialize(serializer)
}
ItemType::F32 => {
NumpyF32Array::new(slice!(self.data() as *const f32, self.num_items()))
.serialize(serializer)
}
ItemType::F16 => {
NumpyF16Array::new(slice!(self.data() as *const u16, self.num_items()))
.serialize(serializer)
}
ItemType::U64 => {
NumpyU64Array::new(slice!(self.data() as *const u64, self.num_items()))
.serialize(serializer)
}
ItemType::U32 => {
NumpyU32Array::new(slice!(self.data() as *const u32, self.num_items()))
.serialize(serializer)
}
ItemType::U16 => {
NumpyU16Array::new(slice!(self.data() as *const u16, self.num_items()))
.serialize(serializer)
}
ItemType::U8 => {
NumpyU8Array::new(slice!(self.data() as *const u8, self.num_items()))
.serialize(serializer)
}
ItemType::I64 => {
NumpyI64Array::new(slice!(self.data() as *const i64, self.num_items()))
.serialize(serializer)
}
ItemType::I32 => {
NumpyI32Array::new(slice!(self.data() as *const i32, self.num_items()))
.serialize(serializer)
}
ItemType::I16 => {
NumpyI16Array::new(slice!(self.data() as *const i16, self.num_items()))
.serialize(serializer)
}
ItemType::I8 => {
NumpyI8Array::new(slice!(self.data() as *const i8, self.num_items()))
.serialize(serializer)
}
ItemType::BOOL => {
NumpyBoolArray::new(slice!(self.data() as *const u8, self.num_items()))
.serialize(serializer)
}
ItemType::DATETIME64(unit) => NumpyDatetime64Array::new(
slice!(self.data() as *const i64, self.num_items()),
unit,
self.opts,
)
.serialize(serializer),
}
}
}