@@ -8,7 +8,7 @@ use crate::{encoder::Encoder, Arc, Error, ObjectIdentifier, Result};
8
8
#[ derive( Debug ) ]
9
9
pub ( crate ) struct Parser {
10
10
/// Current arc in progress
11
- current_arc : Arc ,
11
+ current_arc : Option < Arc > ,
12
12
13
13
/// BER/DER encoder
14
14
encoder : Encoder < { ObjectIdentifier :: MAX_SIZE } > ,
@@ -25,7 +25,7 @@ impl Parser {
25
25
26
26
match bytes[ 0 ] {
27
27
b'0' ..=b'9' => Self {
28
- current_arc : 0 ,
28
+ current_arc : None ,
29
29
encoder : Encoder :: new ( ) ,
30
30
}
31
31
. parse_bytes ( bytes) ,
@@ -42,37 +42,50 @@ impl Parser {
42
42
const fn parse_bytes ( mut self , bytes : & [ u8 ] ) -> Result < Self > {
43
43
match bytes {
44
44
// TODO(tarcieri): use `?` when stable in `const fn`
45
- [ ] => match self . encoder . arc ( self . current_arc ) {
46
- Ok ( encoder) => {
47
- self . encoder = encoder;
48
- Ok ( self )
49
- }
50
- Err ( err) => Err ( err) ,
45
+ [ ] => match self . current_arc {
46
+ Some ( arc) => match self . encoder . arc ( arc) {
47
+ Ok ( encoder) => {
48
+ self . encoder = encoder;
49
+ Ok ( self )
50
+ }
51
+ Err ( err) => Err ( err) ,
52
+ } ,
53
+ None => Err ( Error :: TrailingDot ) ,
51
54
} ,
52
55
[ byte @ b'0' ..=b'9' , remaining @ ..] => {
53
56
let digit = byte. saturating_sub ( b'0' ) ;
54
- self . current_arc = match self . current_arc . checked_mul ( 10 ) {
57
+ let arc = match self . current_arc {
58
+ Some ( arc) => arc,
59
+ None => 0 ,
60
+ } ;
61
+
62
+ self . current_arc = match arc. checked_mul ( 10 ) {
55
63
Some ( arc) => match arc. checked_add ( digit as Arc ) {
56
- Some ( arc) => arc,
57
64
None => return Err ( Error :: ArcTooBig ) ,
65
+ arc => arc,
58
66
} ,
59
67
None => return Err ( Error :: ArcTooBig ) ,
60
68
} ;
61
69
self . parse_bytes ( remaining)
62
70
}
63
71
[ b'.' , remaining @ ..] => {
64
- if remaining. is_empty ( ) {
65
- return Err ( Error :: TrailingDot ) ;
66
- }
72
+ match self . current_arc {
73
+ Some ( arc) => {
74
+ if remaining. is_empty ( ) {
75
+ return Err ( Error :: TrailingDot ) ;
76
+ }
67
77
68
- // TODO(tarcieri): use `?` when stable in `const fn`
69
- match self . encoder . arc ( self . current_arc ) {
70
- Ok ( encoder) => {
71
- self . encoder = encoder;
72
- self . current_arc = 0 ;
73
- self . parse_bytes ( remaining)
78
+ // TODO(tarcieri): use `?` when stable in `const fn`
79
+ match self . encoder . arc ( arc) {
80
+ Ok ( encoder) => {
81
+ self . encoder = encoder;
82
+ self . current_arc = None ;
83
+ self . parse_bytes ( remaining)
84
+ }
85
+ Err ( err) => Err ( err) ,
86
+ }
74
87
}
75
- Err ( err ) => Err ( err ) ,
88
+ None => Err ( Error :: RepeatedDot ) ,
76
89
}
77
90
}
78
91
[ byte, ..] => Err ( Error :: DigitExpected { actual : * byte } ) ,
0 commit comments