summaryrefslogtreecommitdiffstats
path: root/vendor/gix-ref/src/parse.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix-ref/src/parse.rs')
-rw-r--r--vendor/gix-ref/src/parse.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/vendor/gix-ref/src/parse.rs b/vendor/gix-ref/src/parse.rs
new file mode 100644
index 000000000..9656c8197
--- /dev/null
+++ b/vendor/gix-ref/src/parse.rs
@@ -0,0 +1,27 @@
+use gix_object::bstr::{BStr, ByteSlice};
+use nom::{
+ branch::alt,
+ bytes::complete::{tag, take_while_m_n},
+ error::ParseError,
+ IResult,
+};
+
+fn is_hex_digit_lc(b: u8) -> bool {
+ matches!(b, b'0'..=b'9' | b'a'..=b'f')
+}
+
+/// Copy from https://github.com/Byron/gitoxide/blob/f270850ff92eab15258023b8e59346ec200303bd/gix-object/src/immutable/parse.rs#L64
+pub fn hex_hash<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], &'a BStr, E> {
+ // NOTE: It's important to be able to read all hashes, do not parameterize it. Hashes can be rejected at a later stage
+ // if needed.
+ take_while_m_n(
+ gix_hash::Kind::shortest().len_in_hex(),
+ gix_hash::Kind::longest().len_in_hex(),
+ is_hex_digit_lc,
+ )(i)
+ .map(|(i, hex)| (i, hex.as_bstr()))
+}
+
+pub fn newline<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], &'a [u8], E> {
+ alt((tag(b"\r\n"), tag(b"\n")))(i)
+}