use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaInferenceConfig {
pub ignore_outer_array: bool,
pub delimiter: Option<u8>,
pub schema_uri: Option<String>,
pub map_threshold: usize,
pub map_max_required_keys: Option<usize>,
pub unify_maps: bool,
pub force_field_types: HashMap<String, String>,
pub wrap_scalars: bool,
pub wrap_root: Option<String>,
#[cfg(feature = "avro")]
pub avro: bool,
pub debug: bool,
}
impl Default for SchemaInferenceConfig {
fn default() -> Self {
Self {
ignore_outer_array: true,
delimiter: None,
schema_uri: Some("AUTO".to_string()),
map_threshold: 20,
map_max_required_keys: None,
unify_maps: false,
force_field_types: std::collections::HashMap::new(),
wrap_scalars: true,
wrap_root: None,
#[cfg(feature = "avro")]
avro: false,
debug: false,
}
}
}
impl SchemaInferenceConfig {
pub fn debug(&self, args: std::fmt::Arguments) {
if self.debug {
eprintln!("{}", args);
}
}
}
#[macro_export]
macro_rules! debug {
($cfg:expr, $($arg:tt)*) => {
$cfg.debug(format_args!($($arg)*))
};
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaInferenceResult {
pub schema: Value,
pub processed_count: usize,
}
#[cfg(feature = "avro")]
impl SchemaInferenceResult {
pub fn to_avro_schema(
&self,
namespace: &str,
utility_namespace: Option<&str>,
base_uri: Option<&str>,
split_top_level: bool,
) -> Value {
avrotize::converter::jsons_to_avro(
&self.schema,
namespace,
utility_namespace.unwrap_or(""),
base_uri.unwrap_or("genson-core"),
split_top_level,
)
}
}