use std::path::Path;
use crate::{
buffer::add_message,
commands::init::init,
core::{
CompiledCssInMemory, ConfigInMemory, CssBuilderFs, CssBuilderInMemory, CssOptimizer,
GrimoireCssError,
},
};
#[derive(Debug, Clone, Copy, Default)]
pub struct BuildOptions {
pub force_version_update: bool,
}
pub fn build<O: CssOptimizer>(
current_dir: &Path,
css_optimizer: &O,
mode: &str,
options: BuildOptions,
) -> Result<(), GrimoireCssError> {
let config = init(current_dir, mode)?;
let current_version = env!("CARGO_PKG_VERSION");
let config_version = config.grimoire_css_version.as_deref();
let mismatch = match config_version {
Some(v) => v != current_version,
None => true,
};
if mismatch {
let message = match config_version {
Some(v) => format!("Config version mismatch: version={v}, current={current_version}."),
None => format!("Config has no version; current={current_version}."),
};
if options.force_version_update {
add_message(format!(
"{message} Proceeding due to --force-version-update and updating config."
));
crate::core::ConfigFs::update_config_version_only(current_dir, current_version)?;
} else {
add_message(format!(
"{message} Run `grimoire_css init` to update, or pass --force-version-update to build anyway and update the config."
));
return Err(GrimoireCssError::InvalidInput(message));
}
}
CssBuilderFs::new(&config, current_dir, css_optimizer)?.build()
}
pub fn build_in_memory<O: CssOptimizer>(
css_optimizer: &O,
config_in_memory: &ConfigInMemory,
) -> Result<Vec<CompiledCssInMemory>, GrimoireCssError> {
CssBuilderInMemory::new(config_in_memory, css_optimizer)?.build()
}