use std::{path::PathBuf, sync::Arc}; use async_trait::async_trait; use dagger_sdk::{Container, HostDirectoryOpts, HostDirectoryOptsBuilder}; use crate::dagger_middleware::DaggerMiddleware; use super::RustService; pub struct Assets { client: dagger_sdk::Query, assets: Vec, } impl Assets { pub fn new(client: dagger_sdk::Query) -> Self { Self { client, assets: Vec::default(), } } fn with_folders(mut self, folders: impl IntoIterator>) -> Self { let mut folders = folders.into_iter().map(|f| f.into()).collect::>(); self.assets.append(&mut folders); self } } #[async_trait] impl DaggerMiddleware for Assets { async fn handle(&self, container: Container) -> eyre::Result { let container = self.assets.iter().fold(container, |container, asset_path| { let rel_path = asset_path.display().to_string(); let path = self.client.host().directory(&rel_path); container.with_directory(&rel_path, path) }); Ok(container) } } pub trait AssetsExt { fn with_assets(&mut self, folders: impl IntoIterator>) -> &mut Self { self } } impl AssetsExt for RustService { fn with_assets(&mut self, folders: impl IntoIterator>) -> &mut Self { self.with_stage(super::RustServiceStage::AfterPackage(Arc::new( Assets::new(self.client.clone()).with_folders(folders), ))) } }