mod combined;
mod loose;
mod memory;
pub use combined::CombinedOdb;
pub use loose::LooseOdb;
pub use memory::MemoryOdb;
use alloc::vec::Vec;
use crate::error::{Error, Result};
use crate::object::{Object, ObjectType};
use crate::oid::{HashAlgo, ObjectId};
pub trait ObjectDatabase {
fn algo(&self) -> HashAlgo;
fn contains(&self, id: &ObjectId) -> bool;
fn read(&self, id: &ObjectId) -> Result<(ObjectType, Vec<u8>)>;
fn write(&self, ty: ObjectType, payload: &[u8]) -> Result<ObjectId>;
fn read_object(&self, id: &ObjectId) -> Result<Object> {
let (ty, payload) = self.read(id)?;
Object::parse(self.algo(), ty, &payload)
}
fn read_typed(&self, id: &ObjectId, expected: ObjectType) -> Result<Vec<u8>> {
let (ty, payload) = self.read(id)?;
if ty != expected {
return Err(Error::UnexpectedType {
expected,
actual: ty,
});
}
Ok(payload)
}
}