use std::fmt::Debug;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
#[derive(Clone, Debug, Default, Deserialize, Serialize, ToSchema, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CsvTrim {
#[default]
None,
Headers,
Fields,
All,
}
#[derive(Clone, Debug, Deserialize, Serialize, ToSchema, PartialEq)]
#[serde(default)]
pub struct CsvFormatConfig {
pub delimiter: char,
pub headers: bool,
pub quote: char,
pub escape: Option<char>,
pub double_quote: bool,
pub quoting: bool,
pub comment: Option<char>,
pub flexible: bool,
pub trim: CsvTrim,
}
impl CsvFormatConfig {
pub fn delimiter(&self) -> CsvDelimiter {
self.delimiter.into()
}
}
impl Default for CsvFormatConfig {
fn default() -> Self {
Self {
delimiter: CsvDelimiter::default().0.into(),
headers: false,
quote: '"',
escape: None,
double_quote: true,
quoting: true,
comment: None,
flexible: true,
trim: CsvTrim::None,
}
}
}
#[derive(Copy, Clone)]
pub struct CsvDelimiter(pub u8);
impl CsvDelimiter {
pub const DEFAULT: CsvDelimiter = CsvDelimiter(b',');
}
impl Default for CsvDelimiter {
fn default() -> Self {
Self::DEFAULT
}
}
impl Debug for CsvDelimiter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("CsvDelimiter")
.field(&char::from(self.0))
.finish()
}
}
impl From<char> for CsvDelimiter {
fn from(value: char) -> Self {
Self(value.try_into().unwrap_or(b','))
}
}
#[derive(Debug, Deserialize, Serialize, ToSchema)]
#[serde(default)]
pub struct CsvEncoderConfig {
pub delimiter: char,
pub buffer_size_records: usize,
}
impl Default for CsvEncoderConfig {
fn default() -> Self {
Self {
delimiter: CsvDelimiter::default().0.into(),
buffer_size_records: 10_000,
}
}
}