query-forge 0.8.0

Run SQL queries and dataset diffs on XLSX/XML/CSV/JSON/JSONL/Markdown/HTML/Feather/Parquet inputs and export results as text, CSV, JSONL, Markdown, XML, HTML, XLSX, Feather, or Parquet
Documentation
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(())
}