ev_lib_gen 0.1.2

Generates the TS uikit class tables from ev_lib_classes (Rust is the source of truth).
//! Emits `ts/uikit/src/generated/variants.ts` from the Rust styling source of truth,
//! and copies `tokens.css` over. Run via `cargo run -p ev_lib_gen`; the output is
//! committed and CI fails if it drifts (`git diff --exit-code ts/uikit/src/generated`).

use std::{fmt::Write as _, fs, path::Path};

use ev_lib_classes::{BUTTON_BASE, ButtonVariant, Size, button_size_class};
use strum::IntoEnumIterator;
use tailwind_fuse::AsTailwindClass;

fn main() {
	let root = Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");

	let variants = root.join("ts/uikit/src/generated/variants.ts");
	fs::create_dir_all(variants.parent().expect("variants path has a parent")).expect("create generated dir");
	fs::write(&variants, button_variants_ts()).expect("write variants.ts");

	fs::copy(root.join("rust/src/uikit/tokens.css"), root.join("ts/uikit/styles/tokens.css")).expect("copy tokens.css");

	println!("wrote {}", variants.display());
}

fn button_variants_ts() -> String {
	let mut out = String::from("// AUTO-GENERATED by `cargo run -p ev_lib_gen` — do not edit.\n\n");

	writeln!(out, "export const BUTTON_BASE = {BUTTON_BASE:?};\n").unwrap();

	out.push_str("export const buttonVariantClasses = {\n");
	for v in ButtonVariant::iter() {
		writeln!(out, "  {:?}: {:?},", v.as_ref(), v.as_class()).unwrap();
	}
	out.push_str("} as const;\n\n");

	// Per-component key recipe: Size×icon → shadcn's flat size keys.
	out.push_str("export const buttonSizeClasses = {\n");
	for (size, key) in [(Size::Md, "default"), (Size::Sm, "sm"), (Size::Lg, "lg")] {
		writeln!(out, "  {:?}: {:?},", key, button_size_class(size, false)).unwrap();
	}
	for (size, key) in [(Size::Md, "icon"), (Size::Sm, "icon-sm"), (Size::Lg, "icon-lg")] {
		writeln!(out, "  {:?}: {:?},", key, button_size_class(size, true)).unwrap();
	}
	out.push_str("} as const;\n\n");

	out.push_str("export type ButtonVariant = keyof typeof buttonVariantClasses;\n");
	out.push_str("export type ButtonSize = keyof typeof buttonSizeClasses;\n");
	out
}