radicle_protocol/
fetcher.rs1use nonempty::NonEmpty;
2use radicle::storage::refs::RefsAt;
3use serde::{Deserialize, Serialize};
4
5pub mod service;
6pub use service::FetcherService;
7
8pub mod state;
9pub use state::{ActiveFetch, Config, FetcherState, MaxQueueSize, Queue, QueueIter, QueuedFetch};
10
11#[cfg(test)]
12mod test;
13
14#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
20pub enum RefsToFetch {
21 All,
23 Refs(NonEmpty<RefsAt>),
25}
26
27impl RefsToFetch {
28 pub(super) fn merge(self, other: RefsToFetch) -> Self {
33 match (self, other) {
34 (RefsToFetch::All, _) | (_, RefsToFetch::All) => RefsToFetch::All,
35 (RefsToFetch::Refs(mut ours), RefsToFetch::Refs(theirs)) => {
36 ours.extend(theirs);
37 RefsToFetch::Refs(ours)
38 }
39 }
40 }
41
42 #[cfg(test)]
43 pub fn len(&self) -> Option<std::num::NonZeroUsize> {
44 match self {
45 RefsToFetch::All => None,
46 RefsToFetch::Refs(refs) => std::num::NonZeroUsize::new(refs.len()),
47 }
48 }
49}
50
51impl From<RefsToFetch> for Vec<RefsAt> {
52 fn from(val: RefsToFetch) -> Self {
53 match val {
54 RefsToFetch::All => Vec::new(),
55 RefsToFetch::Refs(refs) => refs.into(),
56 }
57 }
58}
59
60impl From<Vec<RefsAt>> for RefsToFetch {
61 fn from(refs_at: Vec<RefsAt>) -> Self {
62 match NonEmpty::from_vec(refs_at) {
63 Some(refs) => RefsToFetch::Refs(refs),
64 None => RefsToFetch::All,
65 }
66 }
67}