Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ab9e28b

Browse files
committedDec 15, 2023
v0.2.0 - multi-grammar support
1 parent b78b9f8 commit ab9e28b

File tree

19 files changed

+244
-167
lines changed

19 files changed

+244
-167
lines changed
 

‎Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
#
3+
# This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
15
[workspace]
26
resolver = "2"
37
members = [
@@ -6,3 +10,10 @@ members = [
610
,"pta-parser"
711
,'pta-types',
812
]
13+
14+
# Default values for workspace projects
15+
[workspace.package]
16+
edition = "2021"
17+
version = "0.2.0"
18+
authors = ["AltaModa Technologies"]
19+
respository = "https://github.com/altamodatech/pta-parser"

‎cli/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
# Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
#
3+
# This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
15
[package]
26
name = "cli"
3-
version = "0.1.0"
4-
edition = "2021"
7+
version.workspace = true
8+
authors.workspace = true
9+
respository.workspace = true
10+
edition.workspace = true
511

612

713
[dependencies]

‎cli/src/main.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
//
3+
// This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
//
5+
16
extern crate pta_ledger;
27
extern crate pta_parser;
38

@@ -52,11 +57,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5257
#[cfg(test)]
5358
mod cli_tests {
5459

55-
use pta_parser::GenericParser;
60+
use pta_parser::parsers::generic::Parser;
5661

5762
#[test]
5863
fn can_create_parser() {
5964
// simply verifies that the parser can be instantiated, ensuring accessibility
60-
let _ = GenericParser{};
65+
let _ = Parser{};
6166
}
6267
}

‎pta-ledger/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
# Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
#
3+
# This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
15
[package]
26
name = "pta-ledger"
3-
version = "0.1.0"
4-
edition = "2021"
7+
version.workspace = true
8+
authors.workspace = true
9+
respository.workspace = true
10+
edition.workspace = true
511

612
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
713
[lib]

‎pta-ledger/src/ledger_builder.rs

Lines changed: 78 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
//
3+
// This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
//
5+
16

27
use log::{info, warn, as_error};
38

@@ -7,8 +12,7 @@ use pta_types::*;
712

813
// TODO: how to isolate pest so clients can just use lib (w/o requiring pest as here)
914
use pest::{*, iterators::Pair};
10-
use pta_parser::{GenericParser, Rule};
11-
15+
use pta_parser::parsers::generic;
1216

1317
#[derive(Default)]
1418
pub struct LedgerBuilder {
@@ -20,17 +24,17 @@ impl LedgerBuilder {
2024

2125
self.pl = ParsedLedger::default();
2226

23-
match GenericParser::parse(Rule::ledger, &ledger) {
27+
match generic::Parser::parse(generic::Rule::generic_ledger, &ledger) {
2428
Ok(root) => {
25-
info!("Successfully parsed with Rule::ledger");
29+
info!("Successfully parsed with generic::Rule::generic_ledger");
2630
for pair in root.into_iter() {
2731
info!("LedgerBuilder::from_string: root pair is {:}", pair.as_str());
2832
self.handle_pair(pair)?;
2933
}
3034
}
3135

3236
Err(err) => {
33-
warn!(err = as_error!(err); "failed to parse with Rule::ledger");
37+
warn!(err = as_error!(err); "failed to parse with generic::Rule::generic_ledger");
3438
return Err(Box::new(err));
3539
}
3640
}
@@ -39,48 +43,48 @@ impl LedgerBuilder {
3943
}
4044

4145

42-
fn handle_pair(self: &Self, pair: Pair<'_, Rule>) -> Result<(), Box<dyn std::error::Error>> {
46+
fn handle_pair(self: &Self, pair: Pair<'_, generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
4347

4448
match pair.as_rule() {
45-
Rule::comment => {
46-
info!("Rule::comment: {:?}", pair.as_span().as_str());
49+
generic::Rule::comment => {
50+
info!("generic::Rule::comment: {:?}", pair.as_span().as_str());
4751
}
48-
Rule::EOI => {
49-
info!("Rule::EOI at {:?}", pair.line_col());
52+
generic::Rule::EOI => {
53+
info!("generic::Rule::EOI at {:?}", pair.line_col());
5054
}
5155

52-
Rule::WHITESPACE => {}
53-
Rule::acct_descriptor => { dump_pair(&pair); return Ok(()); }
54-
Rule::acct_separator => { dump_pair(&pair); return Ok(()); }
55-
Rule::balance_directive => { dump_pair(&pair); return Ok(()); }
56-
Rule::comment_or_newline => { dump_pair(&pair); return Ok(()); }
57-
Rule::comment_token => { dump_pair(&pair); return Ok(()); }
58-
Rule::currency => { dump_pair(&pair); return Ok(()); }
59-
Rule::decimal_value => { dump_pair(&pair); return Ok(()); }
60-
Rule::directive_close => { dump_pair(&pair); return Ok(()); }
61-
Rule::directive_commodity => { dump_pair(&pair); return Ok(()); }
62-
Rule::directive_open => { dump_pair(&pair); return Ok(()); }
63-
Rule::directives => { dump_pair(&pair); return Ok(()); }
64-
Rule::empty_line => {}
65-
Rule::iso8601_date_extended => { dump_pair(&pair); return Ok(()); }
66-
Rule::ledger => {
56+
generic::Rule::WHITESPACE => {}
57+
generic::Rule::acct_descriptor => { dump_pair(&pair); return Ok(()); }
58+
generic::Rule::acct_separator => { dump_pair(&pair); return Ok(()); }
59+
generic::Rule::balance_directive => { dump_pair(&pair); return Ok(()); }
60+
generic::Rule::comment_or_newline => { dump_pair(&pair); return Ok(()); }
61+
generic::Rule::comment_token => { dump_pair(&pair); return Ok(()); }
62+
generic::Rule::currency => { dump_pair(&pair); return Ok(()); }
63+
generic::Rule::decimal_value => { dump_pair(&pair); return Ok(()); }
64+
generic::Rule::directive_close => { dump_pair(&pair); return Ok(()); }
65+
generic::Rule::directive_commodity => { dump_pair(&pair); return Ok(()); }
66+
generic::Rule::directive_open => { dump_pair(&pair); return Ok(()); }
67+
generic::Rule::directives => { dump_pair(&pair); return Ok(()); }
68+
generic::Rule::empty_line => {}
69+
generic::Rule::iso8601_date_extended => { dump_pair(&pair); return Ok(()); }
70+
generic::Rule::generic_ledger => {
6771
return handle_ledger_rule(&pair);
6872
}
69-
Rule::options => { dump_pair(&pair); return Ok(()); }
70-
Rule::posting_basic => {
73+
generic::Rule::options => { dump_pair(&pair); return Ok(()); }
74+
generic::Rule::posting_basic => {
7175
dump_pair(&pair); return Ok(());
7276
}
73-
Rule::posting_indent => { dump_pair(&pair); return Ok(()); }
74-
Rule::sub_acct => { dump_pair(&pair); return Ok(()); }
75-
Rule::top_level_acct => { dump_pair(&pair); return Ok(()); }
76-
Rule::trans_annotation => { dump_pair(&pair); return Ok(()); }
77-
Rule::trans_description => { dump_pair(&pair); return Ok(()); }
78-
Rule::trans_description_text => { dump_pair(&pair); return Ok(()); }
79-
Rule::trans_header => {
77+
generic::Rule::posting_indent => { dump_pair(&pair); return Ok(()); }
78+
generic::Rule::sub_acct => { dump_pair(&pair); return Ok(()); }
79+
generic::Rule::top_level_acct => { dump_pair(&pair); return Ok(()); }
80+
generic::Rule::trans_annotation => { dump_pair(&pair); return Ok(()); }
81+
generic::Rule::trans_description => { dump_pair(&pair); return Ok(()); }
82+
generic::Rule::trans_description_text => { dump_pair(&pair); return Ok(()); }
83+
generic::Rule::trans_header => {
8084
let mut xn = raw_transaction::RawTransaction::default();
8185
return handle_trans_header(&mut xn, &pair);
8286
}
83-
Rule::transaction_block => {
87+
generic::Rule::transaction_block => {
8488
let mut xn = raw_transaction::RawTransaction::default();
8589
return handle_trans_block(&mut xn, &pair);
8690
}
@@ -93,23 +97,23 @@ impl LedgerBuilder {
9397
}
9498

9599

96-
fn dump_rule_of_pair(p: &Pair<Rule>) {
100+
fn dump_rule_of_pair(p: &Pair<generic::Rule>) {
97101
info!("RULE: {:?} at {:?}; SPAN: {:?}", &p.as_rule(), &p.line_col(), &p.as_span());
98102
}
99103

100104
// REMOVE:
101105
#[allow(dead_code)]
102-
fn dump_rule(r:&Rule, s:&Span) {
106+
fn dump_rule(r:&generic::Rule, s:&Span) {
103107
info!("RULE: {:?}; SPAN: {:?}", &r, &s);
104108
}
105109

106-
fn dump_pair(p:&Pair<Rule>) {
110+
fn dump_pair(p:&Pair<generic::Rule>) {
107111
dump_rule_of_pair(p);
108112
}
109113

110114

111115

112-
fn handle_ledger_rule(pair: & Pair<Rule>) -> Result<(), Box<dyn std::error::Error>> {
116+
fn handle_ledger_rule(pair: & Pair<generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
113117
for inner_pair in pair.clone().into_inner() {
114118

115119
match handle_pair(inner_pair) {
@@ -126,9 +130,9 @@ fn handle_ledger_rule(pair: & Pair<Rule>) -> Result<(), Box<dyn std::error::Erro
126130
}
127131

128132
#[allow(dead_code)] // TODO: REMOVE allow dead code
129-
fn handle_posting_basic(_xn: &mut raw_transaction::RawTransaction, pair: &Pair<Rule>) -> Result<(), Box<dyn std::error::Error>> {
133+
fn handle_posting_basic(_xn: &mut raw_transaction::RawTransaction, pair: &Pair<generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
130134

131-
match GenericParser::parse(Rule::posting_basic, pair.as_span().as_str()) {
135+
match generic::Parser::parse(generic::Rule::posting_basic, pair.as_span().as_str()) {
132136
Ok(_posting) => {
133137
info!("handling posting_basic");
134138
// handle_posting_basic(xn, posting); TODO: fix
@@ -144,13 +148,13 @@ fn handle_posting_basic(_xn: &mut raw_transaction::RawTransaction, pair: &Pair<R
144148
return Ok(());
145149
}
146150

147-
fn handle_trans_header(_: &mut raw_transaction::RawTransaction, _: &Pair<Rule>) -> Result<(), Box<dyn std::error::Error>> {
151+
fn handle_trans_header(_: &mut raw_transaction::RawTransaction, _: &Pair<generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
148152
info!("handling trans_header...");
149153

150154
return Ok(());
151155
}
152156

153-
fn handle_trans_block(xn: &mut raw_transaction::RawTransaction, pair: &Pair<Rule>) -> Result<(), Box<dyn std::error::Error>> {
157+
fn handle_trans_block(xn: &mut raw_transaction::RawTransaction, pair: &Pair<generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
154158
info!("handling trans_block...");
155159

156160
xn.pinfo = ParserInfo {
@@ -161,7 +165,7 @@ fn handle_trans_block(xn: &mut raw_transaction::RawTransaction, pair: &Pair<Rule
161165
};
162166

163167
info!("parse with trans_header");
164-
match GenericParser::parse(Rule::trans_header, &pair.as_span().as_str()) {
168+
match generic::Parser::parse(generic::Rule::trans_header, &pair.as_span().as_str()) {
165169
Ok(hdr) => {
166170
for pair in hdr.into_iter() {
167171
info!("attempt handle_trans_header on {}", pair.as_span().as_str());
@@ -195,45 +199,45 @@ fn handle_trans_block(xn: &mut raw_transaction::RawTransaction, pair: &Pair<Rule
195199

196200

197201

198-
fn handle_pair(pair: Pair<'_, Rule>) -> Result<(), Box<dyn std::error::Error>> {
202+
fn handle_pair(pair: Pair<'_, generic::Rule>) -> Result<(), Box<dyn std::error::Error>> {
199203
match pair.as_rule() {
200-
Rule::comment => {
201-
info!("Rule::comment: {:?}", pair.as_span().as_str());
204+
generic::Rule::comment => {
205+
info!("generic::Rule::comment: {:?}", pair.as_span().as_str());
202206
}
203-
Rule::EOI => {
204-
info!("Rule::EOI at {:?}", pair.line_col());
207+
generic::Rule::EOI => {
208+
info!("generic::Rule::EOI at {:?}", pair.line_col());
205209
}
206210

207-
Rule::WHITESPACE => {}
208-
Rule::acct_descriptor => { dump_pair(&pair); return Ok(()); }
209-
Rule::acct_separator => { dump_pair(&pair); return Ok(()); }
210-
Rule::balance_directive => { dump_pair(&pair); return Ok(()); }
211-
Rule::comment_or_newline => { dump_pair(&pair); return Ok(()); }
212-
Rule::comment_token => { dump_pair(&pair); return Ok(()); }
213-
Rule::currency => { dump_pair(&pair); return Ok(()); }
214-
Rule::decimal_value => { dump_pair(&pair); return Ok(()); }
215-
Rule::directive_close => { dump_pair(&pair); return Ok(()); }
216-
Rule::directive_commodity => { dump_pair(&pair); return Ok(()); }
217-
Rule::directive_open => { dump_pair(&pair); return Ok(()); }
218-
Rule::directives => { dump_pair(&pair); return Ok(()); }
219-
Rule::empty_line => {}
220-
Rule::iso8601_date_extended => { dump_pair(&pair); return Ok(()); }
221-
Rule::ledger => {
211+
generic::Rule::WHITESPACE => {}
212+
generic::Rule::acct_descriptor => { dump_pair(&pair); return Ok(()); }
213+
generic::Rule::acct_separator => { dump_pair(&pair); return Ok(()); }
214+
generic::Rule::balance_directive => { dump_pair(&pair); return Ok(()); }
215+
generic::Rule::comment_or_newline => { dump_pair(&pair); return Ok(()); }
216+
generic::Rule::comment_token => { dump_pair(&pair); return Ok(()); }
217+
generic::Rule::currency => { dump_pair(&pair); return Ok(()); }
218+
generic::Rule::decimal_value => { dump_pair(&pair); return Ok(()); }
219+
generic::Rule::directive_close => { dump_pair(&pair); return Ok(()); }
220+
generic::Rule::directive_commodity => { dump_pair(&pair); return Ok(()); }
221+
generic::Rule::directive_open => { dump_pair(&pair); return Ok(()); }
222+
generic::Rule::directives => { dump_pair(&pair); return Ok(()); }
223+
generic::Rule::empty_line => {}
224+
generic::Rule::iso8601_date_extended => { dump_pair(&pair); return Ok(()); }
225+
generic::Rule::generic_ledger => {
222226
return handle_ledger_rule(&pair);
223227
}
224-
Rule::options => { dump_pair(&pair); return Ok(()); }
225-
Rule::posting_basic => { dump_pair(&pair); return Ok(()); }
226-
Rule::posting_indent => { dump_pair(&pair); return Ok(()); }
227-
Rule::sub_acct => { dump_pair(&pair); return Ok(()); }
228-
Rule::top_level_acct => { dump_pair(&pair); return Ok(()); }
229-
Rule::trans_annotation => { dump_pair(&pair); return Ok(()); }
230-
Rule::trans_description => { dump_pair(&pair); return Ok(()); }
231-
Rule::trans_description_text => { dump_pair(&pair); return Ok(()); }
232-
Rule::trans_header => {
228+
generic::Rule::options => { dump_pair(&pair); return Ok(()); }
229+
generic::Rule::posting_basic => { dump_pair(&pair); return Ok(()); }
230+
generic::Rule::posting_indent => { dump_pair(&pair); return Ok(()); }
231+
generic::Rule::sub_acct => { dump_pair(&pair); return Ok(()); }
232+
generic::Rule::top_level_acct => { dump_pair(&pair); return Ok(()); }
233+
generic::Rule::trans_annotation => { dump_pair(&pair); return Ok(()); }
234+
generic::Rule::trans_description => { dump_pair(&pair); return Ok(()); }
235+
generic::Rule::trans_description_text => { dump_pair(&pair); return Ok(()); }
236+
generic::Rule::trans_header => {
233237
let mut xn = raw_transaction::RawTransaction::default();
234238
return handle_trans_header(&mut xn, &pair);
235239
}
236-
Rule::transaction_block => {
240+
generic::Rule::transaction_block => {
237241
let mut xn = raw_transaction::RawTransaction::default();
238242
return handle_trans_block(&mut xn, &pair);
239243
}

‎pta-ledger/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
//
3+
// This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
//
5+
16
pub extern crate pest;
27
pub extern crate pest_derive;
38
pub extern crate pta_parser;

‎pta-parser/Cargo.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
# Copyright (C) 2023, AltaModa Technologies, LLC. All rights reserved.
2+
#
3+
# This project is licensed under the terms of the MIT license (cf. LICENSE file in root).
4+
15
[package]
26
name = "pta-parser"
3-
version = "0.1.0"
4-
edition = "2021"
7+
version.workspace = true
8+
authors.workspace = true
9+
respository.workspace = true
10+
edition.workspace = true
511

612
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
713
[lib]

0 commit comments

Comments
 (0)
Please sign in to comment.