pub mod error; use std::collections::{BTreeMap, HashSet}; use radicle::crypto::PublicKey; use radicle::git; use radicle::{identity::DocAt, storage::RefUpdate}; #[derive(Debug, Clone)] pub struct FetchResult { /// The set of updated references. pub updated: Vec, /// The canonical references that were updated as part of the fetch process. pub canonical: UpdatedCanonicalRefs, /// The set of remote namespaces that were updated. pub namespaces: HashSet, /// The fetch was a full clone. pub clone: bool, /// Identity doc of fetched repo. pub doc: DocAt, } impl FetchResult { pub fn new(doc: DocAt) -> Self { Self { updated: vec![], canonical: UpdatedCanonicalRefs::default(), namespaces: HashSet::new(), clone: false, doc, } } } /// The set of canonical references, updated after a fetch, and their /// corresponding targets. #[derive(Clone, Default, Debug)] pub struct UpdatedCanonicalRefs { inner: BTreeMap, git::Oid>, } impl IntoIterator for UpdatedCanonicalRefs { type Item = (git::Qualified<'static>, git::Oid); type IntoIter = std::collections::btree_map::IntoIter, git::Oid>; fn into_iter(self) -> Self::IntoIter { self.inner.into_iter() } } impl UpdatedCanonicalRefs { /// Insert a new updated entry for the canonical reference identified by /// `refname` and its new `target.` pub fn updated(&mut self, refname: git::Qualified<'static>, target: git::Oid) { self.inner.insert(refname, target); } /// Return an iterator of all the updates. pub fn iter(&self) -> impl Iterator, &git::Oid)> { self.inner.iter() } } #[cfg(any(test, feature = "test"))] impl qcheck::Arbitrary for FetchResult { fn arbitrary(g: &mut qcheck::Gen) -> Self { FetchResult { updated: vec![], canonical: UpdatedCanonicalRefs::default(), namespaces: HashSet::arbitrary(g), clone: bool::arbitrary(g), doc: DocAt::arbitrary(g), } } }