/// The error type returned by the [`Find`](crate::Find) trait. pub type Error = Box; /// pub mod existing { use gix_hash::ObjectId; /// The error returned by the [`find(…)`][crate::FindExt::find()] trait methods. #[derive(Debug, thiserror::Error)] #[expect(missing_docs)] pub enum Error { #[error(transparent)] Find(crate::find::Error), #[error("An object with id {} could not be found", .oid)] NotFound { oid: ObjectId }, } } /// pub mod existing_object { use gix_hash::ObjectId; /// The error returned by the various [`find_*()`][crate::FindExt::find_commit()] trait methods. #[derive(Debug, thiserror::Error)] #[expect(missing_docs)] pub enum Error { #[error(transparent)] Find(crate::find::Error), #[error("Could not decode object at {oid}")] Decode { oid: ObjectId, source: crate::decode::Error, }, #[error("An object with id {oid} could not be found")] NotFound { oid: ObjectId }, #[error("Expected object of kind {expected} but got {actual} at {oid}")] ObjectKind { oid: ObjectId, actual: crate::Kind, expected: crate::Kind, }, } } /// pub mod existing_iter { use gix_hash::ObjectId; /// The error returned by the various [`find_*_iter()`][crate::FindExt::find_commit_iter()] trait methods. #[derive(Debug, thiserror::Error)] #[expect(missing_docs)] pub enum Error { #[error(transparent)] Find(crate::find::Error), #[error("An object with id {oid} could not be found")] NotFound { oid: ObjectId }, #[error("Expected object of kind {expected} but got {actual} at {oid}")] ObjectKind { oid: ObjectId, actual: crate::Kind, expected: crate::Kind, }, } } /// An implementation of object access traits that stores nothing and finds nothing. #[derive(Debug, Copy, Clone)] pub struct Never; impl super::FindHeader for Never { fn try_header(&self, _id: &gix_hash::oid) -> Result, Error> { Ok(None) } } impl super::Find for Never { fn try_find<'a>(&self, _id: &gix_hash::oid, _buffer: &'a mut Vec) -> Result>, Error> { Ok(None) } } impl super::Exists for Never { fn exists(&self, _id: &gix_hash::oid) -> bool { false } } impl super::Write for Never { fn write_buf(&self, object: crate::Kind, from: &[u8]) -> Result { crate::compute_hash(gix_hash::Kind::default(), object, from).map_err(Into::into) } fn write_buf_with_known_id( &self, _object: crate::Kind, _from: &[u8], id: gix_hash::ObjectId, ) -> Result { Ok(id) } fn write_stream( &self, kind: crate::Kind, size: u64, from: &mut dyn std::io::Read, ) -> Result { crate::compute_stream_hash( gix_hash::Kind::default(), kind, from, size, &mut gix_features::progress::Discard, &std::sync::atomic::AtomicBool::new(false), ) .map_err(Into::into) } fn write_stream_with_known_id( &self, _kind: crate::Kind, mut size: u64, from: &mut dyn std::io::Read, id: gix_hash::ObjectId, ) -> Result { let mut buf = [0u8; u16::MAX as usize]; while size != 0 { let bytes = (size as usize).min(buf.len()); from.read_exact(&mut buf[..bytes])?; size -= bytes as u64; } Ok(id) } }