use async_trait::async_trait;
use codeuchain::core::context::Context;
use codeuchain::core::link::LegacyLink;
use codeuchain::core::middleware::Middleware;
pub struct BeforeOnlyMiddleware;
impl BeforeOnlyMiddleware {
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl Middleware for BeforeOnlyMiddleware {
async fn before(&self, _link: Option<&dyn LegacyLink>, ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("🚀 Starting execution with context: {:?}", ctx);
Ok(())
}
}
pub struct LoggingMiddleware;
impl LoggingMiddleware {
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl Middleware for LoggingMiddleware {
async fn before(&self, link: Option<&dyn LegacyLink>, ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("Before link {:?}: {:?}", link.map(|_| "Link"), ctx);
Ok(())
}
async fn after(&self, link: Option<&dyn LegacyLink>, ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("After link {:?}: {:?}", link.map(|_| "Link"), ctx);
Ok(())
}
}
pub struct TimingMiddleware {
start_times: std::collections::HashMap<String, std::time::Instant>,
}
impl TimingMiddleware {
pub fn new() -> Self {
Self {
start_times: std::collections::HashMap::new(),
}
}
}
#[async_trait]
impl Middleware for TimingMiddleware {
async fn before(&self, _link: Option<&dyn LegacyLink>, _ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
Ok(())
}
async fn after(&self, link: Option<&dyn LegacyLink>, _ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
if link.is_some() {
println!("Link completed");
}
Ok(())
}
async fn on_error(&self, link: Option<&dyn LegacyLink>, error: &Box<dyn std::error::Error + Send + Sync>, _ctx: &Context) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
if link.is_some() {
println!("Error in link: {}", error);
}
Ok(())
}
}