Skip to content

Commit a299d0d

Browse files
committed
[FIX] make date time formatting more modular
1 parent 8b382e9 commit a299d0d

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

parquet-variant/src/to_json.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,23 @@ use std::io::Write;
2424

2525
use crate::variant::{Variant, VariantList, VariantObject};
2626

27+
// Format string constants to avoid duplication and reduce errors
28+
const DATE_FORMAT: &str = "%Y-%m-%d";
29+
const TIMESTAMP_NTZ_FORMAT: &str = "%Y-%m-%dT%H:%M:%S%.6f";
30+
31+
// Helper functions for consistent formatting
32+
fn format_date_string(date: &chrono::NaiveDate) -> String {
33+
date.format(DATE_FORMAT).to_string()
34+
}
35+
36+
fn format_timestamp_ntz_string(ts: &chrono::NaiveDateTime) -> String {
37+
ts.format(TIMESTAMP_NTZ_FORMAT).to_string()
38+
}
39+
40+
fn format_binary_base64(bytes: &[u8]) -> String {
41+
general_purpose::STANDARD.encode(bytes)
42+
}
43+
2744
/// Converts a Variant to JSON and writes it to the provided buffer
2845
///
2946
/// # Arguments
@@ -132,17 +149,17 @@ pub fn variant_to_json(json_buffer: &mut impl Write, variant: &Variant) -> Resul
132149
}
133150
}
134151
Variant::Date(date) => {
135-
write!(json_buffer, "\"{}\"", date.format("%Y-%m-%d"))?;
152+
write!(json_buffer, "\"{}\"", format_date_string(date))?;
136153
}
137154
Variant::TimestampMicros(ts) => {
138155
write!(json_buffer, "\"{}\"", ts.to_rfc3339())?;
139156
}
140157
Variant::TimestampNtzMicros(ts) => {
141-
write!(json_buffer, "\"{}\"", ts.format("%Y-%m-%dT%H:%M:%S%.6f"))?;
158+
write!(json_buffer, "\"{}\"", format_timestamp_ntz_string(ts))?;
142159
}
143160
Variant::Binary(bytes) => {
144161
// Encode binary as base64 string
145-
let base64_str = general_purpose::STANDARD.encode(bytes);
162+
let base64_str = format_binary_base64(bytes);
146163
let json_str = serde_json::to_string(&base64_str).map_err(|e| {
147164
ArrowError::InvalidArgumentError(format!("JSON encoding error: {}", e))
148165
})?;
@@ -311,12 +328,10 @@ ArrowError::InvalidArgumentError("Invalid decimal value".to_string())
311328
ArrowError::InvalidArgumentError("Invalid decimal value".to_string())
312329
})
313330
}
314-
Variant::Date(date) => Ok(Value::String(date.format("%Y-%m-%d").to_string())),
331+
Variant::Date(date) => Ok(Value::String(format_date_string(date))),
315332
Variant::TimestampMicros(ts) => Ok(Value::String(ts.to_rfc3339())),
316-
Variant::TimestampNtzMicros(ts) => Ok(Value::String(
317-
ts.format("%Y-%m-%dT%H:%M:%S%.6f").to_string(),
318-
)),
319-
Variant::Binary(bytes) => Ok(Value::String(general_purpose::STANDARD.encode(bytes))),
333+
Variant::TimestampNtzMicros(ts) => Ok(Value::String(format_timestamp_ntz_string(ts))),
334+
Variant::Binary(bytes) => Ok(Value::String(format_binary_base64(bytes))),
320335
Variant::String(s) | Variant::ShortString(s) => Ok(Value::String(s.to_string())),
321336
Variant::Object(obj) => {
322337
let mut map = serde_json::Map::new();

0 commit comments

Comments
 (0)