11pub ( crate ) mod function {
22 use crate :: { IdentityRef , SignatureRef } ;
33 use bstr:: ByteSlice ;
4- use gix_date:: { time:: Sign , OffsetInSeconds , SecondsSinceUnixEpoch , Time } ;
5- use gix_utils:: btoi:: to_signed;
64 use winnow:: error:: ErrMode ;
75 use winnow:: stream:: Stream ;
86 use winnow:: {
9- combinator:: { alt , opt, separated_pair, terminated } ,
7+ combinator:: { opt, separated_pair} ,
108 error:: { AddContext , ParserError , StrContext } ,
119 prelude:: * ,
1210 stream:: AsChar ,
13- token:: { take , take_until , take_while} ,
11+ token:: take_while,
1412 } ;
1513
16- const SPACE : & [ u8 ] = b" " ;
17-
1814 /// Parse a signature from the bytes input `i` using `nom`.
1915 pub fn decode < ' a , E : ParserError < & ' a [ u8 ] > + AddContext < & ' a [ u8 ] , StrContext > > (
2016 i : & mut & ' a [ u8 ] ,
@@ -23,36 +19,13 @@ pub(crate) mod function {
2319 identity,
2420 opt ( b" " ) ,
2521 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) ,
4123 ) )
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 ( )
5427 } else {
55- Time :: new ( 0 , 0 )
28+ b"" . into ( )
5629 }
5730 } ) ,
5831 )
@@ -109,29 +82,22 @@ pub use function::identity;
10982mod tests {
11083 mod parse_signature {
11184 use bstr:: ByteSlice ;
112- use gix_date:: { time:: Sign , OffsetInSeconds , SecondsSinceUnixEpoch } ;
11385 use gix_testtools:: to_bstr_err;
11486 use winnow:: prelude:: * ;
11587
116- use crate :: { signature, SignatureRef , Time } ;
88+ use crate :: { signature, SignatureRef } ;
11789
11890 fn decode < ' i > (
11991 i : & mut & ' i [ u8 ] ,
12092 ) -> ModalResult < SignatureRef < ' i > , winnow:: error:: TreeError < & ' i [ u8 ] , winnow:: error:: StrContext > > {
12193 signature:: decode. parse_next ( i)
12294 }
12395
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 > {
13197 SignatureRef {
13298 name : name. as_bytes ( ) . as_bstr ( ) ,
13399 email : email. as_bytes ( ) . as_bstr ( ) ,
134- time : Time { seconds , offset , sign } ,
100+ time : time . as_bytes ( ) . as_bstr ( ) ,
135101 }
136102 }
137103
@@ -142,7 +108,7 @@ mod tests {
142108 . parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 -0230" )
143109 . expect( "parse to work" )
144110 . 1 ,
145- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Minus , - 9000 )
111+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 -0230" )
146112 ) ;
147113 }
148114
@@ -153,7 +119,7 @@ mod tests {
153119 . parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 +0230" )
154120 . expect( "parse to work" )
155121 . 1 ,
156- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Plus , 9000 )
122+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 +0230" )
157123 ) ;
158124 }
159125
@@ -164,7 +130,7 @@ mod tests {
164130 . parse_peek( b"Sebastian Thiel <\t byronimo@gmail.com > 1528473343 +0230" )
165131 . expect( "parse to work" )
166132 . 1 ,
167- signature( "Sebastian Thiel" , "\t byronimo@gmail.com " , 1528473343 , Sign :: Plus , 9000 )
133+ signature( "Sebastian Thiel" , "\t byronimo@gmail.com " , " 1528473343 +0230" )
168134 ) ;
169135 }
170136
@@ -175,7 +141,7 @@ mod tests {
175141 . parse_peek( b"Sebastian Thiel <byronimo@gmail.com> 1528473343 -0000" )
176142 . expect( "parse to work" )
177143 . 1 ,
178- signature( "Sebastian Thiel" , "byronimo@gmail.com" , 1528473343 , Sign :: Minus , 0 )
144+ signature( "Sebastian Thiel" , "byronimo@gmail.com" , " 1528473343 -0000" )
179145 ) ;
180146 }
181147
@@ -186,15 +152,15 @@ mod tests {
186152 . parse_peek( b"name <name@example.com> 1288373970 --700" )
187153 . expect( "parse to work" )
188154 . 1 ,
189- signature( "name" , "name@example.com" , 1288373970 , Sign :: Minus , - 252000 )
155+ signature( "name" , "name@example.com" , " 1288373970 --700" )
190156 ) ;
191157 }
192158
193159 #[ test]
194160 fn empty_name_and_email ( ) {
195161 assert_eq ! (
196162 decode. parse_peek( b" <> 12345 -1215" ) . expect( "parse to work" ) . 1 ,
197- signature( "" , "" , 12345 , Sign :: Minus , - 44100 )
163+ signature( "" , "" , " 12345 -1215" )
198164 ) ;
199165 }
200166
@@ -213,7 +179,7 @@ mod tests {
213179 fn invalid_time ( ) {
214180 assert_eq ! (
215181 decode. parse_peek( b"hello <> abc -1215" ) . expect( "parse to work" ) . 1 ,
216- signature( "hello" , "" , 0 , Sign :: Plus , 0 )
182+ signature( "hello" , "" , "" )
217183 ) ;
218184 }
219185 }
0 commit comments