use async_trait::async_trait;
use crate::error::MethodError;
use crate::method::{MethodOutcome, TraversalKind, TraversalMethod};
use crate::peer::PeerTarget;
#[derive(Debug, Default, Clone, Copy)]
pub struct DirectMethod;
#[async_trait]
impl TraversalMethod for DirectMethod {
fn kind(&self) -> TraversalKind {
TraversalKind::Direct
}
async fn attempt(&self, peer: &PeerTarget) -> Result<MethodOutcome, MethodError> {
let addrs = peer.direct_addrs();
if addrs.is_empty() {
return Err(MethodError::failed(
TraversalKind::Direct,
"peer has no known direct address",
));
}
Ok(MethodOutcome::candidates(
TraversalKind::Direct,
addrs.to_vec(),
))
}
}