use praxis_core::config::ProtocolKind;
use crate::{filter::HttpFilter, tcp_filter::TcpFilter};
pub enum AnyFilter {
Http(Box<dyn HttpFilter>),
Tcp(Box<dyn TcpFilter>),
}
impl AnyFilter {
pub fn name(&self) -> &'static str {
match self {
Self::Http(f) => f.name(),
Self::Tcp(f) => f.name(),
}
}
pub fn protocol_level(&self) -> ProtocolKind {
match self {
Self::Http(_) => ProtocolKind::Http,
Self::Tcp(_) => ProtocolKind::Tcp,
}
}
}
#[cfg(test)]
mod tests {
use async_trait::async_trait;
use super::*;
use crate::{
actions::FilterAction,
filter::{FilterError, HttpFilterContext},
};
#[test]
fn http_variant_protocol_level() {
let f = AnyFilter::Http(Box::new(StubHttpFilter));
assert_eq!(
f.protocol_level(),
ProtocolKind::Http,
"Http variant should report Http protocol"
);
}
#[test]
fn tcp_variant_protocol_level() {
let f = AnyFilter::Tcp(Box::new(StubTcpFilter));
assert_eq!(
f.protocol_level(),
ProtocolKind::Tcp,
"Tcp variant should report Tcp protocol"
);
}
#[test]
fn http_variant_name() {
let f = AnyFilter::Http(Box::new(StubHttpFilter));
assert_eq!(
f.name(),
"stub_http",
"Http variant should delegate name to inner filter"
);
}
#[test]
fn tcp_variant_name() {
let f = AnyFilter::Tcp(Box::new(StubTcpFilter));
assert_eq!(f.name(), "stub_tcp", "Tcp variant should delegate name to inner filter");
}
struct StubHttpFilter;
#[async_trait]
impl HttpFilter for StubHttpFilter {
fn name(&self) -> &'static str {
"stub_http"
}
async fn on_request(&self, _ctx: &mut HttpFilterContext<'_>) -> Result<FilterAction, FilterError> {
Ok(FilterAction::Continue)
}
}
struct StubTcpFilter;
#[async_trait]
impl TcpFilter for StubTcpFilter {
fn name(&self) -> &'static str {
"stub_tcp"
}
}
}