Showing the changes to git-object/src (2 of 2 files). Show all
Unified · Split
| @@ -33,13 +33,17 @@ quick_error! { · 32 unmodified lines | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | impl Error { | 35 | impl Error { |
| 36 | pub fn parse_context(mut self, ctx: &'static str) -> Self{ | 36 | fn set_parse_context(mut self, ctx: &'static str) -> Self { |
| 37 | match self { | 37 | match self { |
| 38 | Error::Nom(_, ref mut message) => *message = ctx, | 38 | Error::Nom(_, ref mut message) => *message = ctx, |
| 39 | _ => {} | 39 | _ => {} |
| 40 | }; | 40 | }; |
| 41 | self | 41 | self |
| 42 | } | 42 | } |
| 43 | |||
| 44 | fn context(msg: &'static str) -> impl Fn(nom::Err<Self>) -> nom::Err<Self> { | ||
| 45 | move |e: nom::Err<Self>| e.map(|e| e.set_parse_context(msg)) | ||
| 46 | } | ||
| 43 | } | 47 | } |
| 44 | 48 | ||
| 45 | impl ParseError<&[u8]> for Error { | 49 | impl ParseError<&[u8]> for Error { |
| @@ -6,10 +6,10 @@ use crate::{parsed::Signature, Time}; · 5 unmodified lines | |||
| 6 | use bstr::{BStr, ByteSlice}; | 6 | use bstr::{BStr, ByteSlice}; |
| 7 | use btoi::btoi; | 7 | use btoi::btoi; |
| 8 | use hex::FromHex; | 8 | use hex::FromHex; |
| 9 | use nom::{bytes::complete::tag, IResult, }; | ||
| 10 | use nom::sequence::{tuple, preceded, terminated}; | ||
| 11 | use nom::bytes::complete::{take, take_while, take_while_m_n}; | 9 | use nom::bytes::complete::{take, take_while, take_while_m_n}; |
| 12 | use nom::combinator::map; | 10 | use nom::combinator::map; |
| 11 | use nom::sequence::{preceded, terminated, tuple}; | ||
| 12 | use nom::{bytes::complete::tag, IResult}; | ||
| 13 | 13 | ||
| 14 | #[derive(PartialEq, Eq, Debug, Hash)] | 14 | #[derive(PartialEq, Eq, Debug, Hash)] |
| 15 | pub struct Tag<'data> { | 15 | pub struct Tag<'data> { |
| @@ -75,10 +75,6 @@ fn parse_signature(d: &[u8]) -> Result<Signature, Error> { · 59 unmodified lines | |||
| 75 | }) | 75 | }) |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | fn context(msg: &'static str) -> impl Fn(nom::Err<Error>) -> nom::Err<Error> { | ||
| 79 | move |e: nom::Err<Error>| e.map(|e| e.parse_context(msg)) | ||
| 80 | } | ||
| 81 | |||
| 82 | fn is_hex_digit_lc(b: u8) -> bool { | 78 | fn is_hex_digit_lc(b: u8) -> bool { |
| 83 | match b { | 79 | match b { |
| 84 | b'0'..=b'9' => true, | 80 | b'0'..=b'9' => true, |
| @@ -89,7 +85,14 @@ fn is_hex_digit_lc(b: u8) -> bool { · 4 unmodified lines | |||
| 89 | 85 | ||
| 90 | pub(crate) fn parse_tag_nom(i: &[u8]) -> IResult<&[u8], Tag, Error> { | 86 | pub(crate) fn parse_tag_nom(i: &[u8]) -> IResult<&[u8], Tag, Error> { |
| 91 | const NL: &[u8] = b"\n"; | 87 | const NL: &[u8] = b"\n"; |
| 92 | let (i, _) = terminated(preceded(tag(b"object "), take_while_m_n(40usize, 40, is_hex_digit_lc)), tag(NL))(i).map_err(context("object <40 lowercase hex char>"))?; | 88 | let (i, _) = terminated( |
| 89 | preceded( | ||
| 90 | tag(b"object "), | ||
| 91 | take_while_m_n(40usize, 40, is_hex_digit_lc), | ||
| 92 | ), | ||
| 93 | tag(NL), | ||
| 94 | )(i) | ||
| 95 | .map_err(Error::context("object <40 lowercase hex char>"))?; | ||
| 93 | unimplemented!("parse message nom") | 96 | unimplemented!("parse message nom") |
| 94 | } | 97 | } |
| 95 | 98 | ||