veryl 0.20.1

A modern hardware description language
use crate::OptClean;
use log::info;
use miette::{IntoDiagnostic, Result};
use std::fs;
use veryl_metadata::Metadata;

pub struct CmdClean {
    _opt: OptClean,
}

impl CmdClean {
    pub fn new(opt: OptClean) -> Self {
        Self { _opt: opt }
    }

    pub fn exec(&self, metadata: &mut Metadata) -> Result<bool> {
        for path in metadata.build_info.generated_files.keys() {
            if path.exists() {
                info!("Removing file ({})", path.to_string_lossy());
                fs::remove_file(path).into_diagnostic()?;
            }
        }

        let project_dependencies_path = metadata.project_dependencies_path();
        if project_dependencies_path.exists() {
            info!(
                "Removing dir  ({})",
                project_dependencies_path.to_string_lossy()
            );
            fs::remove_dir_all(&project_dependencies_path).into_diagnostic()?;
        }

        let doc_path = metadata.doc_path();
        if doc_path.exists() {
            info!("Removing dir  ({})", doc_path.to_string_lossy());
            fs::remove_dir_all(&doc_path).into_diagnostic()?;
        }

        metadata.build_info.generated_files.clear();
        metadata.build_info.veryl_version = None;
        metadata.save_build_info()?;

        Ok(true)
    }
}