hledger_parser/
directive.rs

1mod account;
2mod auto_postings;
3mod commodity;
4mod decimal_mark;
5mod include;
6mod payee;
7mod price;
8mod tag;
9mod transaction;
10mod year;
11
12use chumsky::prelude::*;
13
14use crate::component::comment::{block, inline, line};
15use crate::component::whitespace::whitespace;
16use crate::directive::account::account;
17use crate::directive::auto_postings::auto_postings;
18use crate::directive::commodity::commodity;
19use crate::directive::decimal_mark::decimal_mark;
20use crate::directive::include::include;
21use crate::directive::payee::payee;
22use crate::directive::price::price;
23use crate::directive::tag::tag;
24use crate::directive::year::year;
25use crate::state::State;
26
27pub use crate::directive::account::Account;
28pub use crate::directive::auto_postings::{AutoPosting, AutosPostingRule, Query, Term};
29pub use crate::directive::commodity::Commodity;
30pub use crate::directive::decimal_mark::DecimalMark;
31pub use crate::directive::include::{Format, Include};
32pub use crate::directive::payee::Payee;
33pub use crate::directive::price::Price;
34pub use crate::directive::tag::Tag;
35pub use crate::directive::transaction::{
36    Assertion, Periodic as PeriodicTransaction, Posting, Simple as Transaction, Status,
37};
38pub use crate::directive::year::Year;
39
40#[derive(Clone, Debug)]
41pub enum Directive {
42    Account(Account),
43    AutoPostings(AutosPostingRule),
44    Commodity(Commodity),
45    DecimalMark(DecimalMark),
46    Include(Include),
47    Payee(Payee),
48    Price(Price),
49    Tag(Tag),
50    Transaction(Transaction),
51    PeriodicTransaction(PeriodicTransaction),
52    Year(Year),
53}
54
55pub fn directive<'a>() -> impl Parser<'a, &'a str, Directive, extra::Full<Rich<'a, char>, State, ()>>
56{
57    account()
58        .map(Directive::Account)
59        .or(auto_postings().map(Directive::AutoPostings))
60        .or(commodity().map(Directive::Commodity))
61        .or(decimal_mark().map(Directive::DecimalMark))
62        .or(include().map(Directive::Include))
63        .or(payee().map(Directive::Payee))
64        .or(price().map(Directive::Price))
65        .or(tag().map(Directive::Tag))
66        .or(transaction::simple().map(Directive::Transaction))
67        .or(transaction::periodic().map(Directive::PeriodicTransaction))
68        .or(year().map(Directive::Year))
69}
70
71pub fn directives<'a>(
72) -> impl Parser<'a, &'a str, Vec<Directive>, extra::Full<Rich<'a, char>, State, ()>> {
73    directive()
74        .map(Some)
75        .or(inline().map(|_| None))
76        .or(line().map(|_| None))
77        .or(block().map(|_| None))
78        .or(whitespace().repeated().map(|()| None))
79        .separated_by(text::newline())
80        .collect::<Vec<_>>()
81        .map(|directives| directives.into_iter().flatten().collect())
82}