hledger_parser/directive/
payee.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 Payee {
9    pub name: String,
10}
11
12pub fn payee<'a>() -> impl Parser<'a, &'a str, Payee, extra::Full<Rich<'a, char>, State, ()>> {
13    just("payee")
14        .ignore_then(whitespace().repeated().at_least(1))
15        .ignore_then(
16            any()
17                .and_is(text::newline().not())
18                .and_is(just(";").not())
19                .repeated()
20                .at_least(1)
21                .collect::<String>(),
22        )
23        .then_ignore(end_of_line())
24        .map(|payee| Payee {
25            name: payee.trim_end().to_string(),
26        })
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn ok_simple() {
35        let result = payee().then_ignore(end()).parse("payee Test").into_result();
36        assert_eq!(
37            result,
38            Ok(Payee {
39                name: String::from("Test")
40            })
41        );
42    }
43
44    #[test]
45    fn ok_with_comment() {
46        let result = payee()
47            .then_ignore(end())
48            .parse("payee Test ; comment")
49            .into_result();
50        assert_eq!(
51            result,
52            Ok(Payee {
53                name: String::from("Test")
54            })
55        );
56    }
57
58    #[test]
59    fn ok_with_space() {
60        let result = payee()
61            .then_ignore(end())
62            .parse("payee Testing things")
63            .into_result();
64        assert_eq!(
65            result,
66            Ok(Payee {
67                name: String::from("Testing things")
68            })
69        );
70    }
71
72    #[test]
73    fn ok_with_trailing() {
74        let result = payee()
75            .then_ignore(end())
76            .parse("payee 123  ")
77            .into_result();
78        assert_eq!(
79            result,
80            Ok(Payee {
81                name: String::from("123")
82            })
83        );
84    }
85
86    #[test]
87    fn err() {
88        let result = payee().then_ignore(end()).parse("paye Test").into_result();
89        assert!(result.is_err());
90    }
91}