diff options
author | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-03-16 21:03:47 +0700 |
---|---|---|
committer | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-03-16 21:03:47 +0700 |
commit | 912ff0bfdf3482a0db138e6f5284222db93d8875 (patch) | |
tree | 77c43ec6cd230616ba3ffd8fdb2446154b485aec | |
parent | 2b6d0d304459169333761731d6b387096ade92d6 (diff) |
refactor: object file header parsing
-rw-r--r-- | src/object.rs | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/src/object.rs b/src/object.rs index c4edcbd..b270fb9 100644 --- a/src/object.rs +++ b/src/object.rs @@ -37,50 +37,34 @@ impl GitObject { let mut decompressed = Vec::new(); decoder.read_to_end(&mut decompressed).unwrap(); - let mut type_buffer = Vec::new(); - let mut size_buffer = Vec::new(); - let mut data = Vec::new(); + let mut iter = decompressed.iter().peekable(); + + let type_buffer: Vec<u8> = iter.by_ref() + .take_while(|&&byte| byte != b' ') + .cloned() + .collect(); + + let size_buffer: Vec<u8> = iter.by_ref() + .take_while(|&&byte| byte != 0) + .cloned() + .collect(); + + let data: Vec<u8> = iter.cloned().collect(); - let mut current_segment: u8 = 0; // 0: type, 1: size, 2: content - decompressed.iter().for_each(|&byte| { - match current_segment { - 0 => { - if byte != b' ' { - type_buffer.push(byte); - } else { - current_segment += 1; - } - } - 1 => { - if byte != 0 { - size_buffer.push(byte); - } else { - current_segment += 1; - } - } - _ => { - data.push(byte); - } - } - }); let object_type = match String::from_utf8_lossy(&type_buffer).to_string().as_str() { "commit" => { GitObjectType::Commit } "tree" => { GitObjectType::Tree } "tag" => { GitObjectType::Tag } "blob" => { GitObjectType::Blob } _ => { - die!( - "Unknown object type: {} in object {}", - String::from_utf8_lossy(&type_buffer), - sha - ); + die!("Unknown type in object {}", sha); } }; let Ok(size) = String::from_utf8_lossy(&size_buffer).to_string().parse::<usize>() else { die!("Malformed object {}, unknown size", sha); }; if data.len() != size { - die!("Malformed object {}, size doesn't match", sha, size); + die!("Malformed object {}, size doesn't match", sha); } Self { object_type, |