mod chain;
mod error;
mod factory;
mod read;
mod registry;
mod set;
mod write;
pub mod capture;
pub mod concatenate;
pub mod debug;
pub mod drop;
pub mod firewall;
pub mod load_balancer;
pub mod local_rate_limit;
pub mod r#match;
pub mod metrics;
pub mod pass;
pub mod timestamp;
pub mod token_router;
pub mod prelude {
pub use super::{
ConvertProtoConfigError, CreateFilterArgs, CreationError, Filter, FilterError,
FilterInstance, Packet, PacketMut, ReadContext, StaticFilter, WriteContext,
};
}
#[doc(inline)]
pub use self::{
capture::Capture,
chain::FilterChain,
concatenate::Concatenate,
debug::Debug,
drop::Drop,
error::{ConvertProtoConfigError, CreationError, FilterError},
factory::{CreateFilterArgs, DynFilterFactory, FilterFactory, FilterInstance},
firewall::Firewall,
load_balancer::LoadBalancer,
local_rate_limit::LocalRateLimit,
r#match::Match,
pass::Pass,
read::ReadContext,
registry::FilterRegistry,
set::{FilterMap, FilterSet},
timestamp::Timestamp,
token_router::{HashedTokenRouter, TokenRouter},
write::WriteContext,
};
pub use crate::{
net::{Packet, PacketMut},
test::TestFilter,
};
use crate::config::filter::Filter as FilterConfig;
#[enum_dispatch::enum_dispatch(Filter)]
pub enum FilterKind {
Capture,
Concatenate,
Debug,
Drop,
Firewall,
LoadBalancer,
LocalRateLimit,
Pass,
Match,
Timestamp,
TokenRouter,
HashedTokenRouter,
TestFilter,
}
pub trait StaticFilter: Filter + Sized + Into<FilterKind>
where
CreationError: From<<Self::Configuration as TryFrom<Self::BinaryConfiguration>>::Error>
+ From<<Self::BinaryConfiguration as TryFrom<Self::Configuration>>::Error>,
{
const NAME: &'static str;
type Configuration: schemars::JsonSchema
+ serde::Serialize
+ for<'de> serde::Deserialize<'de>
+ TryFrom<Self::BinaryConfiguration>;
type BinaryConfiguration: prost::Message
+ Default
+ TryFrom<Self::Configuration>
+ Send
+ Sync
+ Sized;
fn try_from_config(config: Option<Self::Configuration>) -> Result<Self, CreationError>;
fn from_config(config: Option<Self::Configuration>) -> Self {
Self::try_from_config(config).unwrap()
}
fn factory() -> DynFilterFactory
where
Self: 'static,
{
Box::from(std::marker::PhantomData::<fn() -> Self>)
}
fn ensure_config_exists(
config: Option<Self::Configuration>,
) -> Result<Self::Configuration, CreationError> {
config.ok_or(CreationError::MissingConfig(Self::NAME))
}
fn as_filter_config(
config: impl Into<Option<Self::Configuration>>,
) -> Result<FilterConfig, CreationError> {
Ok(FilterConfig {
name: Self::NAME.into(),
label: None,
config: config
.into()
.map(|config| serde_json::to_value(&config))
.transpose()?,
})
}
#[inline]
fn as_labeled_filter_config(
config: impl Into<Option<Self::Configuration>>,
label: String,
) -> Result<FilterConfig, CreationError> {
Ok(FilterConfig {
name: Self::NAME.into(),
label: Some(label),
config: config
.into()
.map(|config| serde_json::to_value(&config))
.transpose()?,
})
}
}
#[enum_dispatch::enum_dispatch]
pub trait Filter: Send + Sync {
fn read<P: PacketMut>(&self, _: &mut ReadContext<'_, P>) -> Result<(), FilterError> {
Ok(())
}
fn write<P: PacketMut>(&self, _: &mut WriteContext<P>) -> Result<(), FilterError> {
Ok(())
}
}