mod compiler;
mod error;
mod res;
mod util;
mod writer;
pub use error::ResError;
pub use res::*;
use std::path::Path;
use writer::ResWriter;
pub trait Resource {
fn write(&self, writer: &mut ResWriter) -> Result<(), ResError>;
}
#[derive(Default)]
pub struct ResBuilder {
resources: Vec<Box<dyn Resource>>,
}
impl ResBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn from_env() -> Result<Self, ResError> {
Ok(Self::new().push(version_info::VersionInfo::from_env()?))
}
pub fn push<T: 'static + Resource>(mut self, resource: T) -> Self {
self.resources.push(Box::new(resource));
self
}
pub fn save<P: AsRef<Path>>(&self, path: P) -> Result<(), ResError> {
let mut writer = ResWriter::new();
for res in &self.resources {
writer.new_line(); res.write(&mut writer)?;
}
util::to_file(path, writer.as_bytes())?;
Ok(())
}
pub fn compile(&self) -> Result<(), ResError> {
let rc_path = util::out_file("resource.rc")?;
self.save(&rc_path)?;
let res_path = util::out_file("resource.res")?;
compiler::compile(rc_path, &res_path)?;
println!("cargo:rustc-link-arg-bins={}", res_path.display());
Ok(())
}
}