use std::fs::File;
use std::path::{Path, PathBuf};
fn main() {
let icon_png = PathBuf::from("resources/icon.png");
println!("cargo:rerun-if-changed={}", icon_png.display());
if std::env::var("CARGO_CFG_TARGET_OS").ok().as_deref() != Some("windows") {
return;
}
let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("OUT_DIR is not set"));
let icon_ico = out_dir.join("query-forge.ico");
generate_ico_from_png(&icon_png, &icon_ico).expect("failed to generate .ico from resources/icon.png");
let mut resources = winres::WindowsResource::new();
resources.set_icon(icon_ico.to_str().expect("icon path is not valid UTF-8"));
resources
.compile()
.expect("failed to compile Windows resources");
}
fn generate_ico_from_png(icon_png: &Path, icon_ico: &Path) -> Result<(), Box<dyn std::error::Error>> {
let rgba = image::open(icon_png)?.into_rgba8();
let (width, height) = rgba.dimensions();
let icon_image = ico::IconImage::from_rgba_data(width, height, rgba.into_raw());
let icon_entry = ico::IconDirEntry::encode(&icon_image)?;
let mut icon_dir = ico::IconDir::new(ico::ResourceType::Icon);
icon_dir.add_entry(icon_entry);
icon_dir.write(File::create(icon_ico)?)?;
Ok(())
}