hledger_parser/directive/
decimal_mark.rs1use 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}