use super::cluster;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) struct Peer {
pub cluster: cluster::Peer,
pub solicit: Option<bool>,
}
#[derive(Clone, Default)]
pub(crate) struct PeerSetup(kio::Shared<Option<Peer>>);
impl PeerSetup {
pub fn set(&self, peer: Peer) {
let mut slot = self.0.lock();
if slot.is_none() {
*slot = Some(peer);
}
}
pub async fn get(&self) -> Peer {
let slot = self
.0
.wait(|peer| match peer.is_some() {
true => std::task::Poll::Ready(()),
false => std::task::Poll::Pending,
})
.await;
(*slot).expect("waited for Some")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn first_write_wins() {
let first = Peer {
cluster: cluster::Peer {
origin: Some(crate::Origin::new(42).unwrap()),
cost: Some(3),
},
solicit: None,
};
let slot = PeerSetup::default();
slot.set(first);
slot.set(Peer {
cluster: cluster::Peer {
origin: Some(crate::Origin::new(99).unwrap()),
cost: Some(0),
},
solicit: Some(true),
});
assert_eq!(slot.get().await, first);
}
}