Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions vortex-dtype/src/serde/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,31 @@ mod test {
.unwrap();
assert_eq!(struct_dtype, deserialized);
}

#[test]
fn test_serde_struct_fields_from_json_value() {
use serde::de::IntoDeserializer;

use crate::StructFields;

let fields = StructFields::from_iter([
("name", DType::Utf8(Nullability::NonNullable)),
("age", DType::Primitive(PType::I32, Nullability::Nullable)),
]);

let value: serde_json::Value = serde_json::to_value(&fields).unwrap();

let json_str = value.to_string();
let mut deserializer = serde_json::Deserializer::from_str(&json_str);
let from_str: StructFields = DTypeSerde::<StructFields>::new(&SESSION)
.deserialize(&mut deserializer)
.unwrap();
assert_eq!(fields, from_str);

let deserializer = value.into_deserializer();
let from_value: StructFields = DTypeSerde::<StructFields>::new(&SESSION)
.deserialize(deserializer)
.unwrap();
assert_eq!(fields, from_value);
}
}
15 changes: 8 additions & 7 deletions vortex-dtype/src/serde/serde.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright the Vortex contributors

use std::borrow::Cow;
use std::fmt;
use std::fmt::Formatter;
use std::marker::PhantomData;
Expand Down Expand Up @@ -172,8 +173,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, DType> {
where
A: EnumAccess<'de>,
{
let (variant, access) = data.variant::<&str>()?;
match variant {
let (variant, access) = data.variant::<Cow<'_, str>>()?;
match variant.as_ref() {
"Null" => {
access.unit_variant()?;
Ok(DType::Null)
Expand Down Expand Up @@ -216,7 +217,7 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, DType> {
.newtype_variant_seed(DTypeSerde::<ExtDTypeRef>::new(self.session))?;
Ok(DType::Extension(ext))
}
_ => Err(de::Error::unknown_variant(variant, VARIANTS)),
_ => Err(de::Error::unknown_variant(&variant, VARIANTS)),
}
}
}
Expand Down Expand Up @@ -404,8 +405,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, StructFields> {
let mut names: Option<FieldNames> = None;
let mut dtypes: Option<Vec<DType>> = None;

while let Some(key) = map.next_key::<&str>()? {
match key {
while let Some(key) = map.next_key::<Cow<'_, str>>()? {
match key.as_ref() {
"names" => {
if names.is_some() {
return Err(de::Error::duplicate_field("names"));
Expand Down Expand Up @@ -536,8 +537,8 @@ impl<'de> DeserializeSeed<'de> for DTypeSerde<'_, ExtDTypeRef> {
let mut storage_dtype: Option<DType> = None;
let mut metadata: Option<Vec<u8>> = None;

while let Some(key) = map.next_key::<&str>()? {
match key {
while let Some(key) = map.next_key::<Cow<'_, str>>()? {
match key.as_ref() {
"id" => {
if id.is_some() {
return Err(de::Error::duplicate_field("id"));
Expand Down
Loading