lex/config/
config.rs

1/// A parse config.
2#[derive(Clone, Debug)]
3pub struct Config {
4    line_comment_delimiter: Option<String>,
5    spaces_per_tab: usize,
6}
7
8impl Default for Config {
9    fn default() -> Self {
10        Self {
11            line_comment_delimiter: None,
12            spaces_per_tab: 4,
13        }
14    }
15}
16
17impl Config {
18    //! Line Comment Delimiter
19
20    /// Checks if the `line_comment_delimiter` is valid.
21    pub fn is_valid_line_comment_delimiter(line_comment_delimiter: &str) -> bool {
22        !line_comment_delimiter.is_empty()
23            && !line_comment_delimiter.contains("\r")
24            && !line_comment_delimiter.contains("\n")
25    }
26
27    /// Gets the optional line-comment delimiter.
28    pub fn line_comment_delimiter(&self) -> Option<&str> {
29        self.line_comment_delimiter.as_deref()
30    }
31
32    /// Sets the `line_comment_delimiter`.
33    ///
34    /// # Safety
35    /// The `line_comment_delimiter` must be valid.
36    pub unsafe fn set_line_comment_delimiter<S>(&mut self, line_comment_delimiter: S)
37    where
38        S: Into<String>,
39    {
40        let line_comment_delimiter: String = line_comment_delimiter.into();
41
42        debug_assert!(Self::is_valid_line_comment_delimiter(
43            line_comment_delimiter.as_str()
44        ));
45
46        self.line_comment_delimiter = Some(line_comment_delimiter.to_string());
47    }
48
49    /// Sets the `line_comment_delimiter`.
50    ///
51    /// # Safety
52    /// The `line_comment_delimiter` must be valid.
53    pub unsafe fn with_line_comment_delimiter<S>(mut self, line_comment_delimiter: S) -> Self
54    where
55        S: Into<String>,
56    {
57        self.set_line_comment_delimiter(line_comment_delimiter);
58        self
59    }
60}
61
62impl Config {
63    //! Spaces Per Tab
64
65    /// Gets the spaces per tab.
66    pub fn spaces_per_tab(&self) -> usize {
67        self.spaces_per_tab
68    }
69
70    /// Sets the `spaces_per_tab`.
71    ///
72    /// # Safety
73    /// The `spaces_per_tab` cannot be `0`.
74    pub unsafe fn set_spaces_per_tab(&mut self, spaces_per_tab: usize) {
75        debug_assert_ne!(spaces_per_tab, 0);
76
77        self.spaces_per_tab = spaces_per_tab;
78    }
79
80    /// Sets the `spaces_per_tab`.
81    ///
82    /// # Safety
83    /// The `spaces_per_tab` cannot be `0`.
84    pub unsafe fn with_spaces_per_tab(mut self, spaces_per_tab: usize) -> Self {
85        debug_assert_ne!(spaces_per_tab, 0);
86
87        self.set_spaces_per_tab(spaces_per_tab);
88        self
89    }
90}