@@ -10,20 +10,18 @@ use crate::utils::decimal;
10
10
use anyhow:: { Context , Result , bail} ;
11
11
use chrono:: NaiveDate ;
12
12
use nom:: character:: complete:: anychar;
13
+ use nom:: error:: ErrorKind ;
13
14
use nom:: multi:: many_till;
14
15
use nom:: sequence:: { preceded, separated_pair} ;
15
- use nom:: {
16
- IResult ,
17
- error:: { VerboseError , context} ,
18
- } ;
16
+ use nom:: { IResult , Parser , error:: context} ;
19
17
use nom:: {
20
18
branch:: alt,
21
19
bytes:: complete:: { is_a, take} ,
22
20
character:: complete:: none_of,
23
21
combinator:: { map_res, opt, recognize} ,
24
22
multi:: many0,
25
23
multi:: many1,
26
- sequence:: { terminated, tuple } ,
24
+ sequence:: terminated,
27
25
} ;
28
26
use nom:: {
29
27
bytes:: complete:: { tag, tag_no_case} ,
@@ -33,7 +31,7 @@ use nom::{
33
31
34
32
use rust_decimal:: prelude:: * ;
35
33
36
- type Res < T , U > = IResult < T , U , VerboseError < T > > ;
34
+ type Res < T , U > = IResult < T , U , ( T , ErrorKind ) > ;
37
35
38
36
pub struct DegiroParser {
39
37
content : String ,
@@ -60,7 +58,8 @@ pérdidas
60
58
impl DegiroParser {
61
59
fn n_to_m_digits < ' b > ( n : usize , m : usize ) -> impl FnMut ( & ' b str ) -> Res < & ' b str , String > {
62
60
move |input| {
63
- many_m_n ( n, m, one_of ( "0123456789" ) ) ( input)
61
+ many_m_n ( n, m, one_of ( "0123456789" ) )
62
+ . parse ( input)
64
63
. map ( |( next_input, result) | ( next_input, result. into_iter ( ) . collect ( ) ) )
65
64
}
66
65
}
@@ -72,7 +71,8 @@ impl DegiroParser {
72
71
recognize ( many1 ( terminated ( one_of ( "0123456789" ) , many0 ( is_a ( ",." ) ) ) ) ) ,
73
72
|out : & str | Decimal :: from_str ( & decimal:: transform_i18n_es_str ( out) ) ,
74
73
) ,
75
- ) ( input)
74
+ )
75
+ . parse ( input)
76
76
}
77
77
78
78
fn number_no_decimal_digits ( input : & str ) -> Res < & str , Decimal > {
@@ -81,7 +81,8 @@ impl DegiroParser {
81
81
map_res ( recognize ( many1 ( one_of ( "0123456789" ) ) ) , |out : & str | {
82
82
Decimal :: from_str ( out)
83
83
} ) ,
84
- ) ( input)
84
+ )
85
+ . parse ( input)
85
86
}
86
87
87
88
fn number_decimal_digits ( input : & str , count : usize ) -> Res < & str , Decimal > {
@@ -95,35 +96,38 @@ impl DegiroParser {
95
96
) ) ,
96
97
|out : & str | Decimal :: from_str ( & decimal:: transform_i18n_es_str ( out) ) ,
97
98
) ,
98
- ) ( input)
99
+ )
100
+ . parse ( input)
99
101
}
100
102
101
103
fn earnings_value ( input : & str ) -> Res < & str , Decimal > {
102
104
context (
103
105
"earnings value" ,
104
106
map_res (
105
- recognize ( tuple ( (
107
+ recognize ( (
106
108
opt ( one_of ( "+-" ) ) ,
107
109
recognize ( many1 ( terminated ( one_of ( "0123456789" ) , many0 ( char ( '.' ) ) ) ) ) ,
108
110
char ( ',' ) ,
109
111
recognize ( many1 ( terminated ( one_of ( "0123456789" ) , many0 ( char ( '.' ) ) ) ) ) ,
110
- ) ) ) ,
112
+ ) ) ,
111
113
|out : & str | Decimal :: from_str ( & decimal:: transform_i18n_es_str ( out) ) ,
112
114
) ,
113
- ) ( input)
115
+ )
116
+ . parse ( input)
114
117
}
115
118
116
119
fn date_concept ( input : & str ) -> Res < & str , NaiveDate > {
117
120
context (
118
121
"date concept" ,
119
- tuple ( (
122
+ (
120
123
DegiroParser :: n_to_m_digits ( 1 , 2 ) ,
121
124
tag ( "/" ) ,
122
125
DegiroParser :: n_to_m_digits ( 1 , 2 ) ,
123
126
tag ( "/" ) ,
124
127
DegiroParser :: n_to_m_digits ( 1 , 4 ) ,
125
- ) ) ,
126
- ) ( input)
128
+ ) ,
129
+ )
130
+ . parse ( input)
127
131
. map ( |( next_input, res) | {
128
132
let ( day, _, month, _, year) = res;
129
133
(
@@ -142,19 +146,21 @@ impl DegiroParser {
142
146
context (
143
147
"broker operation" ,
144
148
alt ( ( tag_no_case ( "C" ) , tag_no_case ( "V" ) ) ) ,
145
- ) ( input)
149
+ )
150
+ . parse ( input)
146
151
. map ( |( next_input, res) | ( next_input, res. into ( ) ) )
147
152
}
148
153
149
154
fn isin ( input : & str ) -> Res < & str , String > {
150
155
context (
151
156
"isin" ,
152
- tuple ( (
157
+ (
153
158
many_m_n ( 2 , 2 , none_of ( "\t \n 0123456789" ) ) ,
154
159
many_m_n ( 9 , 9 , none_of ( "\t \n " ) ) ,
155
160
many1 ( one_of ( "0123456789" ) ) ,
156
- ) ) ,
157
- ) ( input)
161
+ ) ,
162
+ )
163
+ . parse ( input)
158
164
. map ( |( next_input, res) | {
159
165
let ( prefix, main, control) = res;
160
166
let mut result: String = prefix. iter ( ) . collect ( ) ;
@@ -165,8 +171,9 @@ impl DegiroParser {
165
171
}
166
172
167
173
fn company_info ( input : & str ) -> Res < & str , CompanyInfo > {
168
- context ( "company info" , many_till ( anychar, DegiroParser :: isin) ) ( input) . map (
169
- |( next_input, res) | {
174
+ context ( "company info" , many_till ( anychar, DegiroParser :: isin) )
175
+ . parse ( input)
176
+ . map ( |( next_input, res) | {
170
177
let ( company_name, isin) = res;
171
178
let company_name: String = company_name. into_iter ( ) . collect ( ) ;
172
179
let company_name = company_name. replace ( '\n' , " " ) . trim_end ( ) . to_string ( ) ;
@@ -178,8 +185,7 @@ impl DegiroParser {
178
185
isin,
179
186
} ,
180
187
)
181
- } ,
182
- )
188
+ } )
183
189
}
184
190
185
191
fn account_note < ' a > (
@@ -188,7 +194,7 @@ impl DegiroParser {
188
194
) -> Res < & ' a str , AccountNote > {
189
195
context (
190
196
"account note" ,
191
- tuple ( (
197
+ (
192
198
DegiroParser :: date_concept,
193
199
tag ( " " ) ,
194
200
DegiroParser :: company_info,
@@ -206,10 +212,11 @@ impl DegiroParser {
206
212
DegiroParser :: decimal_value,
207
213
tag ( " " ) ,
208
214
DegiroParser :: decimal_value,
209
- opt ( tuple ( ( char ( ' ' ) , DegiroParser :: earnings_value) ) ) ,
215
+ opt ( ( char ( ' ' ) , DegiroParser :: earnings_value) ) ,
210
216
tag ( "\n " ) ,
211
- ) ) ,
212
- ) ( input)
217
+ ) ,
218
+ )
219
+ . parse ( input)
213
220
. map ( |( next_input, res) | {
214
221
let (
215
222
date,
@@ -249,7 +256,7 @@ impl DegiroParser {
249
256
log:: trace!( "balance note: -{}-" , input) ;
250
257
context (
251
258
"balance note" ,
252
- tuple ( (
259
+ (
253
260
tag ( "\n " ) ,
254
261
|input| DegiroParser :: number_decimal_digits ( input, 2 ) , // value in euro
255
262
|input| DegiroParser :: number_decimal_digits ( input, 4 ) , // price
@@ -258,8 +265,9 @@ impl DegiroParser {
258
265
take ( 3usize ) , // market
259
266
alt ( ( tag ( "Stock" ) , tag ( "ETF" ) ) ) , // product type: Stock | ETF
260
267
DegiroParser :: company_info, // company info
261
- ) ) ,
262
- ) ( input)
268
+ ) ,
269
+ )
270
+ . parse ( input)
263
271
. map ( |( next_input, res) | {
264
272
let ( _, value_in_euro, price, currency, quantity, market, _product_type, company) = res;
265
273
@@ -287,7 +295,8 @@ impl DegiroParser {
287
295
many0 ( preceded ( char ( '\n' ) , |x| {
288
296
DegiroParser :: account_note ( x, broker)
289
297
} ) ) ,
290
- ) ( input)
298
+ )
299
+ . parse ( input)
291
300
}
292
301
293
302
fn balance_notes < ' a > (
@@ -297,7 +306,8 @@ impl DegiroParser {
297
306
context (
298
307
"balance notes" ,
299
308
many0 ( |x| DegiroParser :: balance_note ( x, broker) ) ,
300
- ) ( input)
309
+ )
310
+ . parse ( input)
301
311
}
302
312
303
313
fn parse_account_notes ( & self , notes : & str ) -> Result < AccountNotes > {
@@ -400,10 +410,7 @@ impl DegiroParser {
400
410
#[ allow( clippy:: mistyped_literal_suffixes) ]
401
411
mod tests {
402
412
use super :: * ;
403
- use nom:: {
404
- Err as NomErr ,
405
- error:: { ErrorKind , VerboseError , VerboseErrorKind } ,
406
- } ;
413
+ use nom:: error:: ErrorKind ;
407
414
408
415
#[ test]
409
416
fn broker_operation_test ( ) {
@@ -417,13 +424,7 @@ mod tests {
417
424
) ;
418
425
assert_eq ! (
419
426
DegiroParser :: broker_operation( "Z " ) ,
420
- Err ( NomErr :: Error ( VerboseError {
421
- errors: vec![
422
- ( "Z " , VerboseErrorKind :: Nom ( ErrorKind :: Tag ) ) ,
423
- ( "Z " , VerboseErrorKind :: Nom ( ErrorKind :: Alt ) ) ,
424
- ( "Z " , VerboseErrorKind :: Context ( "broker operation" ) ) ,
425
- ]
426
- } ) )
427
+ Err ( nom:: Err :: Error ( ( "Z " , ErrorKind :: Tag ) ) )
427
428
) ;
428
429
}
429
430
@@ -439,12 +440,7 @@ mod tests {
439
440
) ;
440
441
assert_eq ! (
441
442
DegiroParser :: date_concept( "32_23_2020 " ) ,
442
- Err ( NomErr :: Error ( VerboseError {
443
- errors: vec![
444
- ( "_23_2020 " , VerboseErrorKind :: Nom ( ErrorKind :: Tag ) ) ,
445
- ( "32_23_2020 " , VerboseErrorKind :: Context ( "date concept" ) ) ,
446
- ]
447
- } ) )
443
+ Err ( nom:: Err :: Error ( ( "_23_2020 " , ErrorKind :: Tag ) ) )
448
444
) ;
449
445
}
450
446
@@ -460,13 +456,7 @@ mod tests {
460
456
) ;
461
457
assert_eq ! (
462
458
DegiroParser :: isin( "US342342 " ) ,
463
- Err ( NomErr :: Error ( VerboseError {
464
- errors: vec![
465
- ( " " , VerboseErrorKind :: Nom ( ErrorKind :: NoneOf ) ) ,
466
- ( " " , VerboseErrorKind :: Nom ( ErrorKind :: ManyMN ) ) ,
467
- ( "US342342 " , VerboseErrorKind :: Context ( "isin" ) ) ,
468
- ]
469
- } ) )
459
+ Err ( nom:: Err :: Error ( ( " " , ErrorKind :: NoneOf ) ) )
470
460
) ;
471
461
}
472
462
@@ -516,13 +506,7 @@ STOCK WHEN-ISSUED US36262G1013 "#;
516
506
) ;
517
507
assert_eq ! (
518
508
DegiroParser :: decimal_value( "a234,23 " ) ,
519
- Err ( NomErr :: Error ( VerboseError {
520
- errors: vec![
521
- ( "a234,23 " , VerboseErrorKind :: Nom ( ErrorKind :: OneOf ) ) ,
522
- ( "a234,23 " , VerboseErrorKind :: Nom ( ErrorKind :: Many1 ) ) ,
523
- ( "a234,23 " , VerboseErrorKind :: Context ( "decimal value" ) ) ,
524
- ]
525
- } ) )
509
+ Err ( nom:: Err :: Error ( ( "a234,23 " , ErrorKind :: OneOf ) ) )
526
510
) ;
527
511
}
528
512
@@ -542,16 +526,7 @@ STOCK WHEN-ISSUED US36262G1013 "#;
542
526
) ;
543
527
assert_eq ! (
544
528
DegiroParser :: number_decimal_digits( "a234,23 " , 2 ) ,
545
- Err ( NomErr :: Error ( VerboseError {
546
- errors: vec![
547
- ( "a234,23 " , VerboseErrorKind :: Nom ( ErrorKind :: OneOf ) ) ,
548
- ( "a234,23 " , VerboseErrorKind :: Nom ( ErrorKind :: Many1 ) ) ,
549
- (
550
- "a234,23 " ,
551
- VerboseErrorKind :: Context ( "number n decimal digits" )
552
- ) ,
553
- ]
554
- } ) )
529
+ Err ( nom:: Err :: Error ( ( "a234,23 " , ErrorKind :: OneOf ) ) )
555
530
) ;
556
531
}
557
532
@@ -571,12 +546,7 @@ STOCK WHEN-ISSUED US36262G1013 "#;
571
546
) ;
572
547
assert_eq ! (
573
548
DegiroParser :: earnings_value( "1234\n " ) ,
574
- Err ( NomErr :: Error ( VerboseError {
575
- errors: vec![
576
- ( "\n " , VerboseErrorKind :: Char ( ',' ) ) ,
577
- ( "1234\n " , VerboseErrorKind :: Context ( "earnings value" ) ) ,
578
- ]
579
- } ) )
549
+ Err ( nom:: Err :: Error ( ( "\n " , ErrorKind :: Char ) ) )
580
550
) ;
581
551
}
582
552
0 commit comments