Skip to main content

oak_dsv/language/
mod.rs

1#![doc = include_str!("readme.md")]
2use crate::{lexer::token_type::DsvTokenType, parser::element_type::DsvElementType};
3use oak_core::{Language, LanguageCategory};
4#[cfg(feature = "serde")]
5mod deserializer;
6#[cfg(feature = "serde")]
7mod serializer;
8#[cfg(feature = "serde")]
9pub use deserializer::from_value;
10#[cfg(feature = "serde")]
11pub use serializer::to_value;
12
13/// DSV language implementation for the Oaks framework.
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, std::marker::ConstParamTy)]
16pub struct DsvLanguage {
17    /// Field separator, defaults to comma (`,`).
18    pub field_separator: char,
19    /// Quote character, defaults to double quote (`"`).
20    pub quote_char: char,
21}
22
23impl Default for DsvLanguage {
24    fn default() -> Self {
25        Self { field_separator: ',', quote_char: '"' }
26    }
27}
28
29impl DsvLanguage {
30    /// Sets the field separator.
31    pub const fn with_separator(mut self, separator: char) -> Self {
32        self.field_separator = separator;
33        self
34    }
35
36    /// Sets the quote character.
37    pub const fn with_quote_char(mut self, quote: char) -> Self {
38        self.quote_char = quote;
39        self
40    }
41}
42
43/// DSV language marker with configuration.
44#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
45pub struct Dsv<const L: DsvLanguage>;
46
47impl<const L: DsvLanguage> Language for Dsv<L> {
48    const NAME: &'static str = "dsv";
49    const CATEGORY: LanguageCategory = LanguageCategory::Config;
50
51    type TokenType = DsvTokenType;
52    type ElementType = DsvElementType;
53    type TypedRoot = crate::ast::DsvRoot<L>;
54}