hledger_parser/directive/
decimal_mark.rs

1use chumsky::prelude::*;
2
3use crate::component::whitespace::whitespace;
4use crate::state::State;
5use crate::utils::end_of_line;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct DecimalMark(pub char);
9
10pub fn decimal_mark<'a>(
11) -> impl Parser<'a, &'a str, DecimalMark, extra::Full<Rich<'a, char>, State, ()>> {
12    just("decimal-mark")
13        .ignore_then(whitespace().repeated().at_least(1))
14        .ignore_then(one_of(".,"))
15        .then_ignore(end_of_line())
16        .map(DecimalMark)
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn ok_trailing() {
25        let result = decimal_mark()
26            .then_ignore(end())
27            .parse("decimal-mark , ")
28            .into_result();
29        assert_eq!(result, Ok(DecimalMark(',')));
30    }
31
32    #[test]
33    fn ok_comma() {
34        let result = decimal_mark()
35            .then_ignore(end())
36            .parse("decimal-mark ,")
37            .into_result();
38        assert_eq!(result, Ok(DecimalMark(',')));
39    }
40
41    #[test]
42    fn ok_dot() {
43        let result = decimal_mark()
44            .then_ignore(end())
45            .parse("decimal-mark .")
46            .into_result();
47        assert_eq!(result, Ok(DecimalMark('.')));
48    }
49
50    #[test]
51    fn ok_comment() {
52        let result = decimal_mark()
53            .then_ignore(end())
54            .parse("decimal-mark .  ; test")
55            .into_result();
56        assert_eq!(result, Ok(DecimalMark('.')));
57    }
58
59    #[test]
60    fn err_format() {
61        let result = decimal_mark()
62            .then_ignore(end())
63            .parse("decimal-mark ")
64            .into_result();
65        assert!(result.is_err());
66    }
67}