use std::net::SocketAddr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SourcePolicy {
AnyFirstSource,
Exact(SocketAddr),
SameIp,
}
impl SourcePolicy {
pub(crate) fn allows_first(self, source: SocketAddr) -> bool {
match self {
SourcePolicy::AnyFirstSource | SourcePolicy::SameIp => true,
SourcePolicy::Exact(expected) => source == expected,
}
}
pub(crate) fn allows_existing(self, first_source: SocketAddr, incoming: SocketAddr) -> bool {
match self {
SourcePolicy::AnyFirstSource => incoming == first_source,
SourcePolicy::Exact(expected) => incoming == expected && incoming == first_source,
SourcePolicy::SameIp => incoming.ip() == first_source.ip(),
}
}
pub(crate) fn allows_buffered(self, first_source: SocketAddr) -> bool {
match self {
SourcePolicy::AnyFirstSource | SourcePolicy::SameIp => true,
SourcePolicy::Exact(expected) => expected == first_source,
}
}
}