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<(PathBuf, PathBuf)>, } 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().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, (src_asset_path, dest_asset_path)| { let src_path = src_asset_path.display().to_string(); let dest_path = dest_asset_path.display().to_string(); let path = self.client.host().directory(&src_path); container.with_directory(&dest_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), ))) } }