Skip to content

Commit cff8bf8

Browse files
committed
some work
1 parent 800425c commit cff8bf8

File tree

10 files changed

+494
-22
lines changed

10 files changed

+494
-22
lines changed

arrow-json/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ arrow-schema = { workspace = true }
4444
half = { version = "2.1", default-features = false }
4545
indexmap = { version = "2.0", default-features = false, features = ["std"] }
4646
num-traits = { version = "0.2.19", default-features = false, features = ["std"] }
47-
serde = { version = "1.0", default-features = false }
47+
serde_core = { version = "1.0", default-features = false }
4848
serde_json = { version = "1.0", default-features = false, features = ["std"] }
4949
chrono = { workspace = true }
5050
lexical-core = { version = "1.0", default-features = false}

arrow-json/src/reader/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ use std::io::BufRead;
138138
use std::sync::Arc;
139139

140140
use chrono::Utc;
141-
use serde::Serialize;
141+
use serde_core::Serialize;
142142

143143
use arrow_array::timezone::Tz;
144144
use arrow_array::types::*;

arrow-json/src/reader/serializer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
use crate::reader::tape::TapeElement;
1919
use lexical_core::FormattedSize;
20-
use serde::ser::{
20+
use serde_core::ser::{
2121
Impossible, SerializeMap, SerializeSeq, SerializeStruct, SerializeTuple, SerializeTupleStruct,
2222
};
23-
use serde::{Serialize, Serializer};
23+
use serde_core::{Serialize, Serializer};
2424

2525
#[derive(Debug)]
2626
pub struct SerializerError(String);
@@ -33,7 +33,7 @@ impl std::fmt::Display for SerializerError {
3333
}
3434
}
3535

36-
impl serde::ser::Error for SerializerError {
36+
impl serde_core::ser::Error for SerializerError {
3737
fn custom<T>(msg: T) -> Self
3838
where
3939
T: std::fmt::Display,

arrow-json/src/reader/tape.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use crate::reader::serializer::TapeSerializer;
1919
use arrow_schema::ArrowError;
2020
use memchr::memchr2;
21-
use serde::Serialize;
21+
use serde_core::Serialize;
2222
use std::fmt::Write;
2323

2424
/// We decode JSON to a flattened tape representation,

arrow-json/src/writer/encoder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use arrow_cast::display::{ArrayFormatter, FormatOptions};
2626
use arrow_schema::{ArrowError, DataType, FieldRef};
2727
use half::f16;
2828
use lexical_core::FormattedSize;
29-
use serde::Serializer;
29+
use serde_core::Serializer;
3030

3131
/// Configuration options for the JSON encoder.
3232
#[derive(Debug, Clone, Default)]

arrow-schema/Cargo.toml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,27 @@ name = "arrow_schema"
3333
bench = false
3434

3535
[dependencies]
36-
serde = { version = "1.0", default-features = false, features = [
37-
"derive",
36+
serde_core = { version = "1.0", default-features = false, features = [
3837
"std",
3938
"rc",
4039
], optional = true }
4140
bitflags = { version = "2.0.0", default-features = false, optional = true }
4241
serde_json = { version = "1.0", optional = true }
4342

4443
[features]
45-
canonical_extension_types = ["dep:serde", "dep:serde_json"]
44+
canonical_extension_types = ["dep:serde_core", "dep:serde_json"]
4645
# Enable ffi support
4746
ffi = ["bitflags"]
48-
serde = ["dep:serde"]
47+
serde = ["dep:serde_core"]
4948

5049
[package.metadata.docs.rs]
5150
all-features = true
5251

5352
[dev-dependencies]
54-
bincode = { version = "2.0.1", default-features = false, features = ["std", "serde"] }
53+
bincode = { version = "2.0.1", default-features = false, features = [
54+
"std",
55+
"serde",
56+
] }
5557
criterion = { version = "0.5", default-features = false }
5658
insta = "1.43.1"
5759

arrow-schema/src/extension/canonical/fixed_shape_tensor.rs

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//!
2020
//! <https://arrow.apache.org/docs/format/CanonicalExtensions.html#fixed-shape-tensor>
2121
22-
use serde::{Deserialize, Serialize};
22+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
2323

2424
use crate::{ArrowError, DataType, extension::ExtensionType};
2525

@@ -129,7 +129,7 @@ impl FixedShapeTensor {
129129
}
130130

131131
/// Extension type metadata for [`FixedShapeTensor`].
132-
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
132+
#[derive(Debug, Clone, PartialEq)]
133133
pub struct FixedShapeTensorMetadata {
134134
/// The physical shape of the contained tensors.
135135
shape: Vec<usize>,
@@ -141,6 +141,144 @@ pub struct FixedShapeTensorMetadata {
141141
permutations: Option<Vec<usize>>,
142142
}
143143

144+
impl Serialize for FixedShapeTensorMetadata {
145+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
146+
where
147+
S: Serializer,
148+
{
149+
use serde::ser::SerializeStruct;
150+
let mut state = serializer.serialize_struct("FixedShapeTensorMetadata", 3)?;
151+
state.serialize_field("shape", &self.shape)?;
152+
state.serialize_field("dim_names", &self.dim_names)?;
153+
state.serialize_field("permutations", &self.permutations)?;
154+
state.end()
155+
}
156+
}
157+
158+
impl<'de> Deserialize<'de> for FixedShapeTensorMetadata {
159+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
160+
where
161+
D: Deserializer<'de>,
162+
{
163+
use serde::de::{self, MapAccess, Visitor};
164+
use std::fmt;
165+
166+
#[derive(Debug)]
167+
enum Field {
168+
Shape,
169+
DimNames,
170+
Permutations,
171+
}
172+
173+
impl<'de> Deserialize<'de> for Field {
174+
fn deserialize<D>(deserializer: D) -> Result<Field, D::Error>
175+
where
176+
D: Deserializer<'de>,
177+
{
178+
struct FieldVisitor;
179+
180+
impl<'de> Visitor<'de> for FieldVisitor {
181+
type Value = Field;
182+
183+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
184+
formatter.write_str("`shape`, `dim_names`, or `permutations`")
185+
}
186+
187+
fn visit_str<E>(self, value: &str) -> Result<Field, E>
188+
where
189+
E: de::Error,
190+
{
191+
match value {
192+
"shape" => Ok(Field::Shape),
193+
"dim_names" => Ok(Field::DimNames),
194+
"permutations" => Ok(Field::Permutations),
195+
_ => Err(de::Error::unknown_field(
196+
value,
197+
&["shape", "dim_names", "permutations"],
198+
)),
199+
}
200+
}
201+
}
202+
203+
deserializer.deserialize_identifier(FieldVisitor)
204+
}
205+
}
206+
207+
struct FixedShapeTensorMetadataVisitor;
208+
209+
impl<'de> Visitor<'de> for FixedShapeTensorMetadataVisitor {
210+
type Value = FixedShapeTensorMetadata;
211+
212+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
213+
formatter.write_str("struct FixedShapeTensorMetadata")
214+
}
215+
216+
fn visit_seq<V>(self, mut seq: V) -> Result<FixedShapeTensorMetadata, V::Error>
217+
where
218+
V: de::SeqAccess<'de>,
219+
{
220+
let shape = seq
221+
.next_element()?
222+
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
223+
let dim_names = seq
224+
.next_element()?
225+
.ok_or_else(|| de::Error::invalid_length(1, &self))?;
226+
let permutations = seq
227+
.next_element()?
228+
.ok_or_else(|| de::Error::invalid_length(2, &self))?;
229+
Ok(FixedShapeTensorMetadata {
230+
shape,
231+
dim_names,
232+
permutations,
233+
})
234+
}
235+
236+
fn visit_map<V>(self, mut map: V) -> Result<FixedShapeTensorMetadata, V::Error>
237+
where
238+
V: MapAccess<'de>,
239+
{
240+
let mut shape = None;
241+
let mut dim_names = None;
242+
let mut permutations = None;
243+
244+
while let Some(key) = map.next_key()? {
245+
match key {
246+
Field::Shape => {
247+
if shape.is_some() {
248+
return Err(de::Error::duplicate_field("shape"));
249+
}
250+
shape = Some(map.next_value()?);
251+
}
252+
Field::DimNames => {
253+
if dim_names.is_some() {
254+
return Err(de::Error::duplicate_field("dim_names"));
255+
}
256+
dim_names = Some(map.next_value()?);
257+
}
258+
Field::Permutations => {
259+
if permutations.is_some() {
260+
return Err(de::Error::duplicate_field("permutations"));
261+
}
262+
permutations = Some(map.next_value()?);
263+
}
264+
}
265+
}
266+
267+
let shape = shape.ok_or_else(|| de::Error::missing_field("shape"))?;
268+
269+
Ok(FixedShapeTensorMetadata {
270+
shape,
271+
dim_names,
272+
permutations,
273+
})
274+
}
275+
}
276+
277+
const FIELDS: &[&str] = &["shape", "dim_names", "permutations"];
278+
deserializer.deserialize_struct("FixedShapeTensorMetadata", FIELDS, FixedShapeTensorMetadataVisitor)
279+
}
280+
}
281+
144282
impl FixedShapeTensorMetadata {
145283
/// Returns metadata for a fixed shape tensor extension type.
146284
///

arrow-schema/src/extension/canonical/json.rs

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
//!
2020
//! <https://arrow.apache.org/docs/format/CanonicalExtensions.html#json>
2121
22-
use serde::{Deserialize, Serialize};
22+
use serde_core::de::{self, MapAccess, Visitor};
23+
use serde_core::ser::SerializeStruct;
24+
use serde_core::{Deserialize, Deserializer, Serialize, Serializer};
25+
use std::fmt;
2326

2427
use crate::{ArrowError, DataType, extension::ExtensionType};
2528

@@ -42,10 +45,78 @@ use crate::{ArrowError, DataType, extension::ExtensionType};
4245
pub struct Json(JsonMetadata);
4346

4447
/// Empty object
45-
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)]
46-
#[serde(deny_unknown_fields)]
48+
#[derive(Debug, Clone, Copy, PartialEq)]
4749
struct Empty {}
4850

51+
impl Serialize for Empty {
52+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
53+
where
54+
S: Serializer,
55+
{
56+
let state = serializer.serialize_struct("Empty", 0)?;
57+
state.end()
58+
}
59+
}
60+
61+
static EMPTY_FIELDS: &[&str] = &[];
62+
63+
impl<'de> Deserialize<'de> for Empty {
64+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
65+
where
66+
D: Deserializer<'de>,
67+
{
68+
struct EmptyVisitor;
69+
70+
impl<'de> Visitor<'de> for EmptyVisitor {
71+
type Value = Empty;
72+
73+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
74+
formatter.write_str("struct Empty")
75+
}
76+
77+
fn visit_seq<A>(self, mut _seq: A) -> Result<Self::Value, A::Error>
78+
where
79+
A: de::SeqAccess<'de>,
80+
{
81+
Ok(Empty {})
82+
}
83+
84+
fn visit_map<V>(self, mut map: V) -> Result<Empty, V::Error>
85+
where
86+
V: MapAccess<'de>,
87+
{
88+
if let Some(key) = map.next_key::<String>()? {
89+
return Err(de::Error::unknown_field(&key, EMPTY_FIELDS));
90+
}
91+
Ok(Empty {})
92+
}
93+
94+
fn visit_u64<E>(self, _v: u64) -> Result<Self::Value, E>
95+
where
96+
E: de::Error,
97+
{
98+
Err(de::Error::unknown_field("", EMPTY_FIELDS))
99+
}
100+
101+
fn visit_str<E>(self, _v: &str) -> Result<Self::Value, E>
102+
where
103+
E: de::Error,
104+
{
105+
Err(de::Error::unknown_field("", EMPTY_FIELDS))
106+
}
107+
108+
fn visit_bytes<E>(self, _v: &[u8]) -> Result<Self::Value, E>
109+
where
110+
E: de::Error,
111+
{
112+
Err(de::Error::unknown_field("", EMPTY_FIELDS))
113+
}
114+
}
115+
116+
deserializer.deserialize_struct("Empty", EMPTY_FIELDS, EmptyVisitor)
117+
}
118+
}
119+
49120
/// Extension type metadata for [`Json`].
50121
#[derive(Debug, Default, Clone, PartialEq)]
51122
pub struct JsonMetadata(Option<Empty>);

0 commit comments

Comments
 (0)