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