use crate::prelude::*;
#[derive(Debug, Clone)]
pub struct CsvWriteOptions {
pub delimiter: u8,
pub escape: u8,
pub quote: u8,
pub double_quote: bool,
pub null_value: String,
}
impl Default for CsvWriteOptions {
fn default() -> Self {
Self {
delimiter: b',',
escape: b'\\',
quote: b'"',
double_quote: true,
null_value: "NULL".to_string(),
}
}
}
impl CsvWriteOptions {
pub fn validate(&self) -> Result<(), ElusionError> {
if !self.delimiter.is_ascii() {
return Err(ElusionError::InvalidOperation {
operation: "CSV Write".to_string(),
reason: format!("Delimiter '{}' is not a valid ASCII character",
self.delimiter as char),
suggestion: "💡 Use an ASCII character for delimiter".to_string()
});
}
if !self.escape.is_ascii() {
return Err(ElusionError::Custom(format!(
"Escape character '{}' is not a valid ASCII character.",
self.escape as char
)));
}
if !self.quote.is_ascii() {
return Err(ElusionError::Custom(format!(
"Quote character '{}' is not a valid ASCII character.",
self.quote as char
)));
}
if self.null_value.trim().is_empty() {
return Err(ElusionError::Custom("Null value representation cannot be empty.".to_string()));
}
let delimiter_char = self.delimiter as char;
let quote_char = self.quote as char;
if self.null_value.contains(delimiter_char) {
return Err(ElusionError::Custom(format!(
"Null value '{}' cannot contain the delimiter '{}'.",
self.null_value, delimiter_char
)));
}
if self.null_value.contains(quote_char) {
return Err(ElusionError::Custom(format!(
"Null value '{}' cannot contain the quote character '{}'.",
self.null_value, quote_char
)));
}
Ok(())
}
}