use std::sync::Arc;

use async_trait::async_trait;
use dagger_sdk::Container;

use crate::dagger_middleware::DaggerMiddleware;

use super::RustService;

pub struct CargoClean;

impl Default for CargoClean {
    fn default() -> Self {
        Self::new()
    }
}

impl CargoClean {
    pub fn new() -> Self {
        Self {}
    }
}

#[async_trait]
impl DaggerMiddleware for CargoClean {
    async fn handle(&self, container: Container) -> eyre::Result<Container> {
        Ok(container.with_exec(vec!["cargo", "clean"]))
    }
}

pub trait CargoCleanExt {
    fn with_cargo_clean(&mut self) -> &mut Self {
        self
    }
}

impl CargoCleanExt for RustService {
    fn with_cargo_clean(&mut self) -> &mut Self {
        self.with_stage(super::RustServiceStage::BeforeBuild(Arc::new(
            CargoClean::new(),
        )));

        self
    }
}
