@@ -24,6 +24,23 @@ use std::io::Write;
2424
2525use 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())
311328ArrowError :: 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