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::{
10 ActiveFetch, Config, FetchConfig, FetcherState, MaxQueueSize, Queue, QueueIter, QueuedFetch,
11};
12
13#[cfg(test)]
14mod test;
15
16#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
22pub enum RefsToFetch {
23 All,
25 Refs(NonEmpty<RefsAt>),
27}
28
29impl RefsToFetch {
30 pub(super) fn merge(self, other: RefsToFetch) -> Self {
35 match (self, other) {
36 (RefsToFetch::All, _) | (_, RefsToFetch::All) => RefsToFetch::All,
37 (RefsToFetch::Refs(mut ours), RefsToFetch::Refs(theirs)) => {
38 ours.extend(theirs);
39 RefsToFetch::Refs(ours)
40 }
41 }
42 }
43
44 #[cfg(test)]
45 pub fn len(&self) -> Option<std::num::NonZeroUsize> {
46 match self {
47 RefsToFetch::All => None,
48 RefsToFetch::Refs(refs) => std::num::NonZeroUsize::new(refs.len()),
49 }
50 }
51}
52
53impl From<RefsToFetch> for Vec<RefsAt> {
54 fn from(val: RefsToFetch) -> Self {
55 match val {
56 RefsToFetch::All => Vec::new(),
57 RefsToFetch::Refs(refs) => refs.into(),
58 }
59 }
60}
61
62impl From<Vec<RefsAt>> for RefsToFetch {
63 fn from(refs_at: Vec<RefsAt>) -> Self {
64 match NonEmpty::from_vec(refs_at) {
65 Some(refs) => RefsToFetch::Refs(refs),
66 None => RefsToFetch::All,
67 }
68 }
69}