@@ -3,12 +3,13 @@ use std::borrow::Cow;
33use smallvec:: SmallVec ;
44use winnow:: {
55 combinator:: alt,
6+ combinator:: preceded,
67 combinator:: repeat,
78 combinator:: terminated,
8- combinator:: { eof, opt} ,
9+ combinator:: { eof, opt, rest } ,
910 error:: { AddContext , ParserError } ,
1011 prelude:: * ,
11- token:: { tag , take_till1} ,
12+ token:: take_till1,
1213} ;
1314
1415use crate :: { parse, parse:: NL , BStr , ByteSlice , CommitRef } ;
@@ -21,52 +22,43 @@ pub fn message<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8]>>(i: &'a [u8])
2122 . map ( |err : E | err. add_context ( i, "newline + <message>" ) ) ,
2223 ) ;
2324 }
24- let ( i , _ ) = tag ( NL )
25+ preceded ( NL , rest . map ( | s : & [ u8 ] | s . as_bstr ( ) ) )
2526 . context ( "a newline separates headers from the message" )
26- . parse_next ( i) ?;
27- Ok ( ( & [ ] , i. as_bstr ( ) ) )
27+ . parse_next ( i)
2828}
2929
3030pub fn commit < ' a , E : ParserError < & ' a [ u8 ] > + AddContext < & ' a [ u8 ] > > ( i : & ' a [ u8 ] ) -> IResult < & ' a [ u8 ] , CommitRef < ' _ > , E > {
31- let ( i, tree) = ( |i| parse:: header_field ( i, b"tree" , parse:: hex_hash) )
32- . context ( "tree <40 lowercase hex char>" )
33- . parse_next ( i) ?;
34- let ( i, parents) : ( _ , Vec < _ > ) = repeat ( 0 .., |i| parse:: header_field ( i, b"parent" , parse:: hex_hash) )
35- . context ( "zero or more 'parent <40 lowercase hex char>'" )
36- . parse_next ( i) ?;
37- let ( i, author) = ( |i| parse:: header_field ( i, b"author" , parse:: signature) )
38- . context ( "author <signature>" )
39- . parse_next ( i) ?;
40- let ( i, committer) = ( |i| parse:: header_field ( i, b"committer" , parse:: signature) )
41- . context ( "committer <signature>" )
42- . parse_next ( i) ?;
43- let ( i, encoding) = opt ( |i| parse:: header_field ( i, b"encoding" , take_till1 ( NL ) ) )
44- . context ( "encoding <encoding>" )
45- . parse_next ( i) ?;
46- let ( i, extra_headers) = repeat (
47- 0 ..,
48- alt ( (
49- parse:: any_header_field_multi_line. map ( |( k, o) | ( k. as_bstr ( ) , Cow :: Owned ( o) ) ) ,
50- |i| {
51- parse:: any_header_field ( i, take_till1 ( NL ) )
52- . map ( |( i, ( k, o) ) | ( i, ( k. as_bstr ( ) , Cow :: Borrowed ( o. as_bstr ( ) ) ) ) )
53- } ,
54- ) ) ,
31+ (
32+ ( |i| parse:: header_field ( i, b"tree" , parse:: hex_hash) ) . context ( "tree <40 lowercase hex char>" ) ,
33+ repeat ( 0 .., |i| parse:: header_field ( i, b"parent" , parse:: hex_hash) )
34+ . map ( |p : Vec < _ > | p)
35+ . context ( "zero or more 'parent <40 lowercase hex char>'" ) ,
36+ ( |i| parse:: header_field ( i, b"author" , parse:: signature) ) . context ( "author <signature>" ) ,
37+ ( |i| parse:: header_field ( i, b"committer" , parse:: signature) ) . context ( "committer <signature>" ) ,
38+ opt ( |i| parse:: header_field ( i, b"encoding" , take_till1 ( NL ) ) ) . context ( "encoding <encoding>" ) ,
39+ repeat (
40+ 0 ..,
41+ alt ( (
42+ parse:: any_header_field_multi_line. map ( |( k, o) | ( k. as_bstr ( ) , Cow :: Owned ( o) ) ) ,
43+ |i| {
44+ parse:: any_header_field ( i, take_till1 ( NL ) )
45+ . map ( |( i, ( k, o) ) | ( i, ( k. as_bstr ( ) , Cow :: Borrowed ( o. as_bstr ( ) ) ) ) )
46+ } ,
47+ ) ) ,
48+ )
49+ . context ( "<field> <single-line|multi-line>" ) ,
50+ terminated ( message, eof) ,
5551 )
56- . context ( "<field> <single-line|multi-line>" )
57- . parse_next ( i) ?;
58- let ( i, message) = terminated ( message, eof) . parse_next ( i) ?;
59-
60- Ok ( (
61- i,
62- CommitRef {
63- tree,
64- parents : SmallVec :: from ( parents) ,
65- author,
66- committer,
67- encoding : encoding. map ( ByteSlice :: as_bstr) ,
68- message,
69- extra_headers,
70- } ,
71- ) )
52+ . map (
53+ |( tree, parents, author, committer, encoding, extra_headers, message) | CommitRef {
54+ tree,
55+ parents : SmallVec :: from ( parents) ,
56+ author,
57+ committer,
58+ encoding : encoding. map ( ByteSlice :: as_bstr) ,
59+ message,
60+ extra_headers,
61+ } ,
62+ )
63+ . parse_next ( i)
7264}
0 commit comments