feldera_types/format/
csv.rs

1use std::fmt::Debug;
2
3use serde::{Deserialize, Serialize};
4use utoipa::ToSchema;
5
6#[derive(Clone, Debug, Deserialize, Serialize, ToSchema)]
7#[serde(default)]
8pub struct CsvParserConfig {
9    /// Field delimiter (default `','`).
10    ///
11    /// This must be an ASCII character.
12    pub delimiter: char,
13
14    /// Whether the input begins with a header line (which is ignored).
15    pub headers: bool,
16}
17
18impl CsvParserConfig {
19    pub fn delimiter(&self) -> CsvDelimiter {
20        self.delimiter.into()
21    }
22}
23
24impl Default for CsvParserConfig {
25    fn default() -> Self {
26        Self {
27            delimiter: CsvDelimiter::default().0.into(),
28            headers: false,
29        }
30    }
31}
32
33/// A delimiter between CSV records, typically `b','`.
34#[derive(Copy, Clone)]
35pub struct CsvDelimiter(pub u8);
36
37impl CsvDelimiter {
38    pub const DEFAULT: CsvDelimiter = CsvDelimiter(b',');
39}
40
41impl Default for CsvDelimiter {
42    fn default() -> Self {
43        Self::DEFAULT
44    }
45}
46
47impl Debug for CsvDelimiter {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        f.debug_tuple("CsvDelimiter")
50            .field(&char::from(self.0))
51            .finish()
52    }
53}
54
55impl From<char> for CsvDelimiter {
56    fn from(value: char) -> Self {
57        Self(value.try_into().unwrap_or(b','))
58    }
59}
60
61#[derive(Debug, Deserialize, Serialize, ToSchema)]
62#[serde(default)]
63pub struct CsvEncoderConfig {
64    /// Field delimiter (default `','`).
65    ///
66    /// This must be an ASCII character.
67    pub delimiter: char,
68
69    pub buffer_size_records: usize,
70}
71
72impl Default for CsvEncoderConfig {
73    fn default() -> Self {
74        Self {
75            delimiter: CsvDelimiter::default().0.into(),
76            buffer_size_records: 10_000,
77        }
78    }
79}