use gix_testtools::Result; fn hex_to_id(hex: &str) -> gix_hash::ObjectId { gix_hash::ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex") } mod blob; mod index; mod rewrites; mod tree; mod tree_with_rewrites; mod util { use std::collections::HashMap; use gix_hash::oid; use gix_object::{bstr::BString, find::Error}; #[derive(Default)] pub struct ObjectDb { data_by_id: HashMap, } impl gix_object::FindHeader for ObjectDb { fn try_header(&self, id: &oid) -> Result, Error> { match self.data_by_id.get(&id.to_owned()) { Some(data) => Ok(Some(gix_object::Header { kind: gix_object::Kind::Blob, size: data.len() as u64, })), None => Ok(None), } } } impl gix_object::Find for ObjectDb { fn try_find<'a>(&self, id: &oid, buffer: &'a mut Vec) -> Result>, Error> { match self.data_by_id.get(&id.to_owned()) { Some(data) => { buffer.clear(); buffer.extend_from_slice(data); Ok(Some(gix_object::Data { kind: gix_object::Kind::Blob, data: buffer.as_slice(), })) } None => Ok(None), } } } impl ObjectDb { /// Insert `data` and return its hash. That can be used to find it again. pub fn insert(&mut self, data: &str) -> Result { let id = gix_object::compute_hash(gix_hash::Kind::Sha1, gix_object::Kind::Blob, data.as_bytes())?; self.data_by_id.insert(id, data.into()); Ok(id) } } }