11pub ( crate ) mod function {
22 use bstr:: ByteSlice ;
3+ use gix_error:: ValidationError ;
34
4- use crate :: { decode :: Error , IdentityRef , SignatureRef } ;
5+ use crate :: { IdentityRef , SignatureRef } ;
56
67 /// Parse a signature from the bytes input `i`, and change it to point to the unparsed bytes afterwards.
7- pub fn decode < ' a > ( i : & mut & ' a [ u8 ] ) -> Result < SignatureRef < ' a > , Error > {
8+ pub fn decode < ' a > ( i : & mut & ' a [ u8 ] ) -> Result < SignatureRef < ' a > , ValidationError > {
89 let identity = identity ( i) ?;
910 if i. first ( ) == Some ( & b' ' ) {
1011 * i = & i[ 1 ..] ;
@@ -25,19 +26,23 @@ pub(crate) mod function {
2526 }
2627
2728 /// Parse an identity from the bytes input `i` (like `name <email>`).
28- pub fn identity < ' a > ( i : & mut & ' a [ u8 ] ) -> Result < IdentityRef < ' a > , Error > {
29+ pub fn identity < ' a > ( i : & mut & ' a [ u8 ] ) -> Result < IdentityRef < ' a > , ValidationError > {
2930 let eol_idx = i. find_byte ( b'\n' ) . unwrap_or ( i. len ( ) ) ;
30- let right_delim_idx = i[ ..eol_idx] . rfind_byte ( b'>' ) . ok_or ( Error :: MissingClosingBracket ) ?;
31+ let right_delim_idx = i[ ..eol_idx]
32+ . rfind_byte ( b'>' )
33+ . ok_or_else ( || ValidationError :: new ( "Closing '>' not found" ) ) ?;
3134 let i_name_and_email = & i[ ..right_delim_idx] ;
3235 let skip_from_right = i_name_and_email. iter ( ) . rev ( ) . take_while ( |b| * * b == b'>' ) . count ( ) ;
33- let left_delim_idx = i_name_and_email. find_byte ( b'<' ) . ok_or ( Error :: MissingOpeningBracket ) ?;
36+ let left_delim_idx = i_name_and_email
37+ . find_byte ( b'<' )
38+ . ok_or_else ( || ValidationError :: new ( "Opening '<' not found" ) ) ?;
3439 let skip_from_left = i[ left_delim_idx..] . iter ( ) . take_while ( |b| * * b == b'<' ) . count ( ) ;
3540 let mut name = i[ ..left_delim_idx] . as_bstr ( ) ;
3641 name = name. strip_suffix ( b" " ) . unwrap_or ( name) . as_bstr ( ) ;
3742
3843 let email = i
3944 . get ( left_delim_idx + skip_from_left..right_delim_idx - skip_from_right)
40- . ok_or ( Error :: DelimiterOverlap ) ?
45+ . ok_or_else ( || ValidationError :: new ( "Skipped parts run into each other" ) ) ?
4146 . as_bstr ( ) ;
4247 * i = i. get ( right_delim_idx + 1 ..) . unwrap_or ( & [ ] ) ;
4348 Ok ( IdentityRef { name, email } )
@@ -52,9 +57,11 @@ pub use function::identity;
5257#[ cfg( test) ]
5358mod tests {
5459 mod parse_signature {
55- use crate :: { decode :: Error , signature , SignatureRef } ;
60+ use gix_error :: ValidationError ;
5661
57- fn decode ( i : & [ u8 ] ) -> Result < ( & [ u8 ] , SignatureRef < ' _ > ) , Error > {
62+ use crate :: { signature, SignatureRef } ;
63+
64+ fn decode ( i : & [ u8 ] ) -> Result < ( & [ u8 ] , SignatureRef < ' _ > ) , ValidationError > {
5865 let mut i = i;
5966 signature:: decode ( & mut i) . map ( |signature| ( i, signature) )
6067 }
@@ -137,8 +144,10 @@ mod tests {
137144 #[ test]
138145 fn invalid_signature ( ) {
139146 assert_eq ! (
140- decode( b"hello < 12345 -1215" ) . expect_err( "parse fails as > is missing" ) ,
141- Error :: MissingClosingBracket
147+ decode( b"hello < 12345 -1215" )
148+ . expect_err( "parse fails as > is missing" )
149+ . to_string( ) ,
150+ "Closing '>' not found"
142151 ) ;
143152 }
144153
0 commit comments