use std::future::Future;
use std::net::SocketAddr;
use std::pin::Pin;
use std::sync::{Arc, Weak};
use async_trait::async_trait;
use crate::bytes::DynamicByteBuffer;
use crate::settings::Settings;
use crate::utils::socket::SocketError;
use crate::utils::sync::AsyncExecutor;
pub trait ProbeFlowSender: Send + Sync {
fn send_raw<'a>(&'a self, packet: DynamicByteBuffer, target: SocketAddr) -> Pin<Box<dyn Future<Output = Result<(), SocketError>> + Send + 'a>>;
}
#[async_trait]
pub trait ActiveProbeHandler<AE: AsyncExecutor + 'static>: Send + Sync {
async fn start(&mut self, manager: Weak<dyn ProbeFlowSender>, settings: Arc<Settings<AE>>);
async fn process(&mut self, packet: DynamicByteBuffer, source: Option<SocketAddr>);
}
pub type ProbeFactory<AE> = Arc<dyn Fn() -> Box<dyn ActiveProbeHandler<AE>> + Send + Sync>;
pub fn probe_factory<AE, PH>() -> ProbeFactory<AE>
where
AE: AsyncExecutor + 'static,
PH: ActiveProbeHandler<AE> + Default + 'static,
{
Arc::new(|| Box::new(PH::default()))
}