mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-25 07:41:34 +00:00
feat(swarm): report outcome of handling SwarmEvent
Previously, a user wouldn't know whether passing a `SwarmEvent` to `ListenAddresses` or `ExternalAddresses` changed the state. We now return a boolean where `true` indicates that we handled the event **and** changed state as a result. The API is inspired by `HashSet::insert` and the like. Pull-Request: #3865.
This commit is contained in:
@ -32,21 +32,67 @@ impl ExternalAddresses {
|
||||
}
|
||||
|
||||
/// Feed a [`FromSwarm`] event to this struct.
|
||||
///
|
||||
/// Returns whether the event changed our set of external addresses.
|
||||
#[allow(deprecated)]
|
||||
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>)
|
||||
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>) -> bool
|
||||
where
|
||||
THandler: IntoConnectionHandler,
|
||||
{
|
||||
match event {
|
||||
FromSwarm::NewExternalAddr(NewExternalAddr { addr, .. }) => {
|
||||
if self.addresses.len() < self.limit {
|
||||
self.addresses.insert((*addr).clone());
|
||||
return self.addresses.insert((*addr).clone());
|
||||
}
|
||||
}
|
||||
FromSwarm::ExpiredExternalAddr(ExpiredExternalAddr { addr, .. }) => {
|
||||
self.addresses.remove(addr);
|
||||
return self.addresses.remove(addr)
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::dummy;
|
||||
use libp2p_core::multiaddr::Protocol;
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
#[test]
|
||||
fn new_external_addr_returns_correct_changed_value() {
|
||||
let mut addresses = ExternalAddresses::default();
|
||||
|
||||
let changed = addresses.on_swarm_event(&new_external_addr());
|
||||
assert!(changed);
|
||||
|
||||
let changed = addresses.on_swarm_event(&new_external_addr());
|
||||
assert!(!changed)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn expired_external_addr_returns_correct_changed_value() {
|
||||
let mut addresses = ExternalAddresses::default();
|
||||
addresses.on_swarm_event(&new_external_addr());
|
||||
|
||||
let changed = addresses.on_swarm_event(&expired_external_addr());
|
||||
assert!(changed);
|
||||
|
||||
let changed = addresses.on_swarm_event(&expired_external_addr());
|
||||
assert!(!changed)
|
||||
}
|
||||
|
||||
fn new_external_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
|
||||
FromSwarm::NewExternalAddr(NewExternalAddr { addr: &MEMORY_ADDR })
|
||||
}
|
||||
|
||||
fn expired_external_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
|
||||
FromSwarm::ExpiredExternalAddr(ExpiredExternalAddr { addr: &MEMORY_ADDR })
|
||||
}
|
||||
|
||||
static MEMORY_ADDR: Lazy<Multiaddr> =
|
||||
Lazy::new(|| Multiaddr::empty().with(Protocol::Memory(1000)));
|
||||
}
|
||||
|
@ -17,19 +17,69 @@ impl ListenAddresses {
|
||||
}
|
||||
|
||||
/// Feed a [`FromSwarm`] event to this struct.
|
||||
///
|
||||
/// Returns whether the event changed our set of listen addresses.
|
||||
#[allow(deprecated)]
|
||||
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>)
|
||||
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>) -> bool
|
||||
where
|
||||
THandler: IntoConnectionHandler,
|
||||
{
|
||||
match event {
|
||||
FromSwarm::NewListenAddr(NewListenAddr { addr, .. }) => {
|
||||
self.addresses.insert((*addr).clone());
|
||||
self.addresses.insert((*addr).clone())
|
||||
}
|
||||
FromSwarm::ExpiredListenAddr(ExpiredListenAddr { addr, .. }) => {
|
||||
self.addresses.remove(addr);
|
||||
self.addresses.remove(addr)
|
||||
}
|
||||
_ => {}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::dummy;
|
||||
use libp2p_core::multiaddr::Protocol;
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
#[test]
|
||||
fn new_listen_addr_returns_correct_changed_value() {
|
||||
let mut addresses = ListenAddresses::default();
|
||||
|
||||
let changed = addresses.on_swarm_event(&new_listen_addr());
|
||||
assert!(changed);
|
||||
|
||||
let changed = addresses.on_swarm_event(&new_listen_addr());
|
||||
assert!(!changed)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn expired_listen_addr_returns_correct_changed_value() {
|
||||
let mut addresses = ListenAddresses::default();
|
||||
addresses.on_swarm_event(&new_listen_addr());
|
||||
|
||||
let changed = addresses.on_swarm_event(&expired_listen_addr());
|
||||
assert!(changed);
|
||||
|
||||
let changed = addresses.on_swarm_event(&expired_listen_addr());
|
||||
assert!(!changed)
|
||||
}
|
||||
|
||||
fn new_listen_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
|
||||
FromSwarm::NewListenAddr(NewListenAddr {
|
||||
listener_id: Default::default(),
|
||||
addr: &MEMORY_ADDR,
|
||||
})
|
||||
}
|
||||
|
||||
fn expired_listen_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
|
||||
FromSwarm::ExpiredListenAddr(ExpiredListenAddr {
|
||||
listener_id: Default::default(),
|
||||
addr: &MEMORY_ADDR,
|
||||
})
|
||||
}
|
||||
|
||||
static MEMORY_ADDR: Lazy<Multiaddr> =
|
||||
Lazy::new(|| Multiaddr::empty().with(Protocol::Memory(1000)));
|
||||
}
|
||||
|
Reference in New Issue
Block a user