#![allow(clippy::empty_docs)]
use gix_error::ResultExt;
use gix_path::RelativePath;
use gix_ref::file::ReferenceExt;
use crate::Result;
#[must_use = "Iterators should be obtained from this iterator platform"]
pub struct Platform<'r> {
pub(crate) platform: gix_ref::file::iter::Platform<'r>,
pub repo: &'r crate::Repository,
}
pub struct Iter<'packed, 'repo> {
inner: gix_ref::file::iter::LooseThenPacked<'packed, 'repo>,
peel_with_packed: Option<gix_ref::file::packed::SharedBufferSnapshot>,
peel: bool,
repo: &'repo crate::Repository,
}
impl<'packed, 'repo> Iter<'packed, 'repo> {
fn new(repo: &'repo crate::Repository, platform: gix_ref::file::iter::LooseThenPacked<'packed, 'repo>) -> Self {
Iter {
inner: platform,
peel_with_packed: None,
peel: false,
repo,
}
}
}
impl<'repo> Platform<'repo> {
pub fn all(&self) -> Result<Iter<'_, 'repo>> {
Ok(Iter::new(self.repo, self.platform.all().or_erased()?))
}
pub fn prefixed<'a>(
&self,
prefix: impl TryInto<&'a RelativePath, Error = gix_error::Exn<gix_error::Message>>,
) -> Result<Iter<'_, 'repo>> {
let prefix = prefix.try_into()?;
Ok(Iter::new(self.repo, self.platform.prefixed(prefix).or_erased()?))
}
pub fn tags(&self) -> Result<Iter<'_, 'repo>> {
let prefix = b"refs/tags/".try_into()?;
Ok(Iter::new(self.repo, self.platform.prefixed(prefix).or_erased()?))
}
pub fn local_branches(&self) -> Result<Iter<'_, 'repo>> {
let prefix = b"refs/heads/".try_into()?;
Ok(Iter::new(self.repo, self.platform.prefixed(prefix).or_erased()?))
}
pub fn pseudo(&self) -> Result<Iter<'_, 'repo>> {
Ok(Iter::new(self.repo, self.platform.pseudo().or_erased()?))
}
pub fn remote_branches(&self) -> Result<Iter<'_, 'repo>> {
let prefix = b"refs/remotes/".try_into()?;
Ok(Iter::new(self.repo, self.platform.prefixed(prefix).or_erased()?))
}
}
impl Iter<'_, '_> {
pub fn peeled(mut self) -> Result<Self> {
self.peel_with_packed = self.repo.refs.cached_packed_buffer()?;
self.peel = true;
Ok(self)
}
}
impl<'r> Iterator for Iter<'_, 'r> {
type Item = Result<crate::Reference<'r>>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|res| {
let mut r = res?;
if self.peel {
r.peel_to_id_packed(
&self.repo.refs,
&self.repo.objects,
self.peel_with_packed.as_ref().map(|p| &***p),
)?;
}
Ok(crate::Reference::from_ref(r, self.repo))
})
}
}