1
1
pub ( crate ) mod function {
2
2
use crate :: { IdentityRef , SignatureRef } ;
3
3
use bstr:: ByteSlice ;
4
- use gix_date:: { time:: Sign , OffsetInSeconds , SecondsSinceUnixEpoch , Time } ;
5
- use gix_utils:: btoi:: to_signed;
6
4
use winnow:: error:: ErrMode ;
7
5
use winnow:: stream:: Stream ;
8
6
use winnow:: {
9
- combinator:: { alt , opt, separated_pair, terminated } ,
7
+ combinator:: { opt, separated_pair} ,
10
8
error:: { AddContext , ParserError , StrContext } ,
11
9
prelude:: * ,
12
10
stream:: AsChar ,
13
- token:: { take , take_until , take_while} ,
11
+ token:: take_while,
14
12
} ;
15
13
16
- const SPACE : & [ u8 ] = b" " ;
17
-
18
14
/// Parse a signature from the bytes input `i` using `nom`.
19
15
pub fn decode < ' a , E : ParserError < & ' a [ u8 ] > + AddContext < & ' a [ u8 ] , StrContext > > (
20
16
i : & mut & ' a [ u8 ] ,
@@ -23,36 +19,13 @@ pub(crate) mod function {
23
19
identity,
24
20
opt ( b" " ) ,
25
21
opt ( (
26
- terminated ( take_until ( 0 .., SPACE ) , take ( 1usize ) )
27
- . verify_map ( |v| to_signed :: < SecondsSinceUnixEpoch > ( v) . ok ( ) )
28
- . context ( StrContext :: Expected ( "<timestamp>" . into ( ) ) ) ,
29
- alt ( (
30
- take_while ( 1 .., b'-' ) . map ( |_| Sign :: Minus ) ,
31
- take_while ( 1 .., b'+' ) . map ( |_| Sign :: Plus ) ,
32
- ) )
33
- . context ( StrContext :: Expected ( "+|-" . into ( ) ) ) ,
34
- take_while ( 2 , AsChar :: is_dec_digit)
35
- . verify_map ( |v| to_signed :: < OffsetInSeconds > ( v) . ok ( ) )
36
- . context ( StrContext :: Expected ( "HH" . into ( ) ) ) ,
37
- take_while ( 1 ..=2 , AsChar :: is_dec_digit)
38
- . verify_map ( |v| to_signed :: < OffsetInSeconds > ( v) . ok ( ) )
39
- . context ( StrContext :: Expected ( "MM" . into ( ) ) ) ,
40
- take_while ( 0 .., AsChar :: is_dec_digit) . map ( |v : & [ u8 ] | v) ,
22
+ take_while ( 0 .., |b : u8 | b == b'+' || b == b'-' || b. is_space ( ) || b. is_dec_digit ( ) ) . map ( |v : & [ u8 ] | v) ,
41
23
) )
42
- . map ( |maybe_timestamp| {
43
- if let Some ( ( time, sign, hours, minutes, trailing_digits) ) = maybe_timestamp {
44
- let offset = if trailing_digits. is_empty ( ) {
45
- ( hours * 3600 + minutes * 60 ) * if sign == Sign :: Minus { -1 } else { 1 }
46
- } else {
47
- 0
48
- } ;
49
- Time {
50
- seconds : time,
51
- offset,
52
- sign,
53
- }
24
+ . map ( |maybe_bytes| {
25
+ if let Some ( ( bytes, ) ) = maybe_bytes {
26
+ bytes. into ( )
54
27
} else {
55
- Time :: new ( 0 , 0 )
28
+ b"" . into ( )
56
29
}
57
30
} ) ,
58
31
)
@@ -109,29 +82,22 @@ pub use function::identity;
109
82
mod tests {
110
83
mod parse_signature {
111
84
use bstr:: ByteSlice ;
112
- use gix_date:: { time:: Sign , OffsetInSeconds , SecondsSinceUnixEpoch } ;
113
85
use gix_testtools:: to_bstr_err;
114
86
use winnow:: prelude:: * ;
115
87
116
- use crate :: { signature, SignatureRef , Time } ;
88
+ use crate :: { signature, SignatureRef } ;
117
89
118
90
fn decode < ' i > (
119
91
i : & mut & ' i [ u8 ] ,
120
92
) -> ModalResult < SignatureRef < ' i > , winnow:: error:: TreeError < & ' i [ u8 ] , winnow:: error:: StrContext > > {
121
93
signature:: decode. parse_next ( i)
122
94
}
123
95
124
- fn signature (
125
- name : & ' static str ,
126
- email : & ' static str ,
127
- seconds : SecondsSinceUnixEpoch ,
128
- sign : Sign ,
129
- offset : OffsetInSeconds ,
130
- ) -> SignatureRef < ' static > {
96
+ fn signature ( name : & ' static str , email : & ' static str , time : & ' static str ) -> SignatureRef < ' static > {
131
97
SignatureRef {
132
98
name : name. as_bytes ( ) . as_bstr ( ) ,
133
99
email : email. as_bytes ( ) . as_bstr ( ) ,
134
- time : Time { seconds , offset , sign } ,
100
+ time : time . as_bytes ( ) . as_bstr ( ) ,
135
101
}
136
102
}
137
103
@@ -142,7 +108,7 @@ mod tests {
142
108
. parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 -0230" )
143
109
. expect( "parse to work" )
144
110
. 1 ,
145
- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Minus , - 9000 )
111
+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 -0230" )
146
112
) ;
147
113
}
148
114
@@ -153,7 +119,7 @@ mod tests {
153
119
. parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 +0230" )
154
120
. expect( "parse to work" )
155
121
. 1 ,
156
- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Plus , 9000 )
122
+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 +0230" )
157
123
) ;
158
124
}
159
125
@@ -164,7 +130,7 @@ mod tests {
164
130
. parse_peek( b"Sebastian Thiel <\t byronimo@gmail.com > 1528473343 +0230" )
165
131
. expect( "parse to work" )
166
132
. 1 ,
167
- signature( "Sebastian Thiel" , "\t byronimo@gmail.com " , 1528473343 , Sign :: Plus , 9000 )
133
+ signature( "Sebastian Thiel" , "\t byronimo@gmail.com " , " 1528473343 +0230" )
168
134
) ;
169
135
}
170
136
@@ -175,7 +141,7 @@ mod tests {
175
141
. parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 -0000" )
176
142
. expect( "parse to work" )
177
143
. 1 ,
178
- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Minus , 0 )
144
+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 -0000" )
179
145
) ;
180
146
}
181
147
@@ -186,15 +152,15 @@ mod tests {
186
152
. parse_peek( b"name <name@example.com> 1288373970 --700" )
187
153
. expect( "parse to work" )
188
154
. 1 ,
189
- signature( "name" , "name@example.com" , 1288373970 , Sign :: Minus , - 252000 )
155
+ signature( "name" , "name@example.com" , " 1288373970 --700" )
190
156
) ;
191
157
}
192
158
193
159
#[ test]
194
160
fn empty_name_and_email ( ) {
195
161
assert_eq ! (
196
162
decode. parse_peek( b" <> 12345 -1215" ) . expect( "parse to work" ) . 1 ,
197
- signature( "" , "" , 12345 , Sign :: Minus , - 44100 )
163
+ signature( "" , "" , " 12345 -1215" )
198
164
) ;
199
165
}
200
166
@@ -213,7 +179,7 @@ mod tests {
213
179
fn invalid_time ( ) {
214
180
assert_eq ! (
215
181
decode. parse_peek( b"hello <> abc -1215" ) . expect( "parse to work" ) . 1 ,
216
- signature( "hello" , "" , 0 , Sign :: Plus , 0 )
182
+ signature( "hello" , "" , "" )
217
183
) ;
218
184
}
219
185
}
0 commit comments