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