| //! Low-level access to reading and writing chunk file based formats. |
| //! |
| //! See the [git documentation](https://github.com/git/git/blob/seen/Documentation/technical/chunk-format.txt) for details. |
| #![deny(missing_docs, rust_2018_idioms, unsafe_code)] |
| |
| /// An identifier to describe the kind of chunk, unique within a chunk file, typically in ASCII |
| pub type Id = [u8; 4]; |
| |
| /// A special value denoting the end of the chunk file table of contents. |
| pub const SENTINEL: Id = [0u8; 4]; |
| |
| /// |
| #[allow(clippy::empty_docs)] |
| pub mod range { |
| use std::ops::Range; |
| |
| use crate::file; |
| |
| /// Turn a u64 Range into a usize range safely, to make chunk ranges useful in memory mapped files. |
| pub fn into_usize(Range { start, end }: Range<file::Offset>) -> Option<Range<usize>> { |
| let start = start.try_into().ok()?; |
| let end = end.try_into().ok()?; |
| Some(Range { start, end }) |
| } |
| |
| /// Similar to [`into_usize()`], but panics assuming that the memory map couldn't be created if offsets |
| /// stored are too high. |
| /// |
| /// This is only true for correctly formed files, as it's entirely possible to provide out of bounds offsets |
| /// which are checked for separately - we wouldn't be here if that was the case. |
| pub fn into_usize_or_panic(range: Range<file::Offset>) -> Range<usize> { |
| into_usize(range).expect("memory maps can't be created if files are too large") |
| } |
| } |
| |
| /// |
| #[allow(clippy::empty_docs)] |
| pub mod file; |