alamb commented on code in PR #7015: URL: https://github.com/apache/arrow-rs/pull/7015#discussion_r1999503132
########## arrow-json/src/writer/encoder.rs: ########## @@ -25,126 +27,230 @@ use arrow_schema::{ArrowError, DataType, FieldRef}; use half::f16; use lexical_core::FormattedSize; use serde::Serializer; -use std::io::Write; +/// Configuration options for the JSON encoder. #[derive(Debug, Clone, Default)] pub struct EncoderOptions { - pub explicit_nulls: bool, - pub struct_mode: StructMode, + /// Whether to include nulls in the output or elide them. + explicit_nulls: bool, + /// Whether to encode structs as JSON objects or JSON arrays of their values. + struct_mode: StructMode, + /// An optional hook for customizing encoding behavior. + encoder_factory: Option<Arc<dyn EncoderFactory>>, +} + +impl EncoderOptions { + /// Set whether to include nulls in the output or elide them. + pub fn with_explicit_nulls(mut self, explicit_nulls: bool) -> Self { + self.explicit_nulls = explicit_nulls; + self + } + + /// Set whether to encode structs as JSON objects or JSON arrays of their values. + pub fn with_struct_mode(mut self, struct_mode: StructMode) -> Self { + self.struct_mode = struct_mode; + self + } + + /// Set an optional hook for customizing encoding behavior. + pub fn with_encoder_factory(mut self, encoder_factory: Arc<dyn EncoderFactory>) -> Self { + self.encoder_factory = Some(encoder_factory); + self + } + + /// Get whether to include nulls in the output or elide them. + pub fn explicit_nulls(&self) -> bool { + self.explicit_nulls + } + + /// Get whether to encode structs as JSON objects or JSON arrays of their values. + pub fn struct_mode(&self) -> StructMode { + self.struct_mode + } + + /// Get the optional hook for customizing encoding behavior. + pub fn encoder_factory(&self) -> Option<&Arc<dyn EncoderFactory>> { + self.encoder_factory.as_ref() + } +} + +/// A trait to create custom encoders for specific data types. +/// +/// This allows overriding the default encoders for specific data types, +/// or adding new encoders for custom data types. +pub trait EncoderFactory: std::fmt::Debug + Send + Sync { + /// Make an encoder that if returned runs before all of the default encoders. Review Comment: what does "runs before all default encoders" mean? Maybe it would be clearer to say "If a decoder is returned it does not use the default encoder at all" 🤔 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org