use std::marker::PhantomData;
use crate::multiaddr::{Multiaddr, Protocol};
pub trait Predicate<A: ?Sized> {
fn check(&self, arg: &A) -> bool;
}
impl<T, A> Predicate<A> for T
where
T: Fn(&A) -> bool,
A: ?Sized,
{
fn check(&self, arg: &A) -> bool {
(self)(arg)
}
}
#[derive(Debug, Default)]
pub struct FalsePredicate<'a, A>(PhantomData<&'a A>);
impl<A> FalsePredicate<'_, A> {
pub fn new() -> Self {
Self(PhantomData)
}
}
impl<A> Predicate<A> for FalsePredicate<'_, A> {
fn check(&self, _: &A) -> bool {
false
}
}
pub fn is_onion_address(addr: &Multiaddr) -> bool {
let protocol = addr.iter().next();
matches!(protocol, Some(Protocol::Onion(_, _)) | Some(Protocol::Onion3(_)))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn is_onion_address_test() {
let expect_true = [
"/onion/aaimaq4ygg2iegci:1234",
"/onion3/vww6ybal4bd7szmgncyruucpgfkqahzddi37ktceo3ah7ngmcopnpyyd:1234",
];
let expect_false = ["/dns4/mikes-node-nook.com:80", "/ip4/1.2.3.4/tcp/1234"];
expect_true.iter().for_each(|addr| {
let addr = addr.parse().unwrap();
assert!(is_onion_address(&addr));
});
expect_false.iter().for_each(|addr| {
let addr = addr.parse().unwrap();
assert!(!is_onion_address(&addr));
});
}
}