summaryrefslogtreecommitdiff
path: root/src/object.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.rs')
-rw-r--r--src/object.rs46
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,