From f411f2c528139df95904e7ec5834d4742dd6cfde Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 11 Aug 2025 14:09:18 -0700 Subject: [PATCH] work --- rust/pspp/src/output/csv.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/rust/pspp/src/output/csv.rs b/rust/pspp/src/output/csv.rs index 5690f1b711..b776856680 100644 --- a/rust/pspp/src/output/csv.rs +++ b/rust/pspp/src/output/csv.rs @@ -23,7 +23,10 @@ use std::{ sync::Arc, }; -use serde::{Deserialize, Serialize}; +use serde::{ + de::{Unexpected, Visitor}, + Deserialize, Deserializer, Serialize, +}; use crate::output::pivot::Coord2; @@ -45,11 +48,37 @@ pub struct CsvDriver { } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] +#[serde(default)] struct CsvOptions { + #[serde(deserialize_with = "deserialize_ascii_char")] quote: u8, delimiter: u8, } +fn deserialize_ascii_char<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + struct AsciiCharVisitor; + impl<'de> Visitor<'de> for AsciiCharVisitor { + type Value = u8; + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "a single ASCII character") + } + fn visit_str(self, s: &str) -> Result + where + E: serde::de::Error, + { + if s.len() == 1 { + Ok(s.chars().next().unwrap() as u8) + } else { + Err(serde::de::Error::invalid_value(Unexpected::Str(s), &self)) + } + } + } + deserializer.deserialize_char(AsciiCharVisitor) +} + impl Default for CsvOptions { fn default() -> Self { Self { -- 2.30.2