pub(crate) mod core;
use std::path::Path;
use std::{fs, io};
use itertools::{Itertools, concat};
use crate::generate::core::generate_state_plugin_source;
use crate::parsing::header::parse_template_header;
use crate::prelude::PluginConfig;
use crate::processing::ProcessingError;
#[derive(Debug, thiserror::Error)]
pub enum GeneratorError {
#[error("Io Error: {0}")]
Io(#[from] io::Error),
#[error("Processing Error: {0}")]
Processing(#[from] ProcessingError),
}
#[cfg_attr(coverage_nightly, coverage(off))]
pub fn update_template(
template_path: impl AsRef<Path>,
mut plugin_config: PluginConfig,
) -> Result<(), GeneratorError> {
let src_display = template_path.as_ref().to_string_lossy();
println!("cargo:rerun-if-changed={src_display}");
let source = std::fs::read_to_string(&template_path)?;
let header = parse_template_header(&source, &mut plugin_config);
let plugin_source =
generate_state_plugin_source(&header.template.join("\n"), plugin_config, None)?;
let header = concat([
header
.info_block
.into_iter()
.map(|line| format!("// {line}"))
.collect_vec(),
header
.comments_block
.into_iter()
.map(String::from)
.collect_vec(),
])
.join("\n");
fs::write(&template_path, format!("{header}\n\n{plugin_source}")).map_err(Into::into)
}
#[cfg_attr(coverage_nightly, coverage(off))]
pub fn generate_plugin(
src: impl AsRef<Path>,
dst: impl AsRef<Path>,
plugin_config: PluginConfig,
) -> Result<(), GeneratorError> {
let src_display = src.as_ref().to_string_lossy();
println!("cargo:rerun-if-changed={src_display}");
let source = std::fs::read_to_string(&src)?;
let source = generate_state_plugin_source(&source, plugin_config, Some(&src_display))?;
fs::write(dst, source).map_err(Into::into)
}