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