use async_trait::async_trait; use dagger_sdk::Container; use std::{future::Future, pin::Pin, sync::Arc}; pub type DynMiddleware = Arc; #[async_trait] pub trait DaggerMiddleware { async fn handle( &self, container: dagger_sdk::Container, ) -> eyre::Result { Ok(container) } } pub struct DaggerMiddlewareFn where F: Fn(Container) -> Pin> + Send>>, { pub func: F, } pub fn middleware(func: F) -> Box> where F: Fn(Container) -> Pin> + Send>>, { Box::new(DaggerMiddlewareFn { func }) } #[async_trait] impl DaggerMiddleware for DaggerMiddlewareFn where F: Fn(Container) -> Pin> + Send>> + Send + Sync, { async fn handle(&self, container: Container) -> eyre::Result { // Call the closure stored in the struct (self.func)(container).await } } #[cfg(test)] mod test { use futures::FutureExt; use super::*; #[tokio::test] async fn can_add_middleware() -> eyre::Result<()> { middleware(|c| async move { Ok(c) }.boxed()); Ok(()) } }