Expand description
A recursive data structure
Examples found in repository?
src/extension/decode.rs (line 38)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
pub fn all(maybe_beginning_of_extensions: &[u8], object_hash: git_hash::Kind) -> Result<(Outcome, &[u8]), Error> {
let mut ext_iter = match extension::Iter::new_without_checksum(maybe_beginning_of_extensions, object_hash) {
Some(iter) => iter,
None => return Ok((Outcome::default(), maybe_beginning_of_extensions)),
};
let mut ext = Outcome::default();
for (signature, ext_data) in ext_iter.by_ref() {
match signature {
extension::tree::SIGNATURE => {
ext.tree = extension::tree::decode(ext_data, object_hash);
}
extension::resolve_undo::SIGNATURE => {
ext.resolve_undo = extension::resolve_undo::decode(ext_data, object_hash);
}
extension::untracked_cache::SIGNATURE => {
ext.untracked = extension::untracked_cache::decode(ext_data, object_hash);
}
extension::fs_monitor::SIGNATURE => {
ext.fs_monitor = extension::fs_monitor::decode(ext_data);
}
extension::end_of_index_entry::SIGNATURE => {} // skip already done
extension::index_entry_offset_table::SIGNATURE => {} // not relevant/obtained already
mandatory if mandatory[0].is_ascii_lowercase() => match mandatory {
extension::link::SIGNATURE => ext.link = extension::link::decode(ext_data, object_hash)?.into(),
extension::sparse::SIGNATURE => {
if !ext_data.is_empty() {
// only used as a marker, if this changes we need this implementation.
return Err(Error::MandatoryUnimplemented { signature: mandatory });
}
ext.is_sparse = true
}
unknown => return Err(Error::MandatoryUnimplemented { signature: unknown }),
},
_unknown => {} // skip unknown extensions, too
}
}
Ok((ext, &maybe_beginning_of_extensions[ext_iter.consumed..]))
}