use std::{env, fmt::Display, fs, path::Path}; pub struct Assembly(Vec); impl Default for Assembly { fn default() -> Self { Self(vec![1, 2, 3, 4, 5, 6, 7]) } } impl From for Assembly { fn from(sids: String) -> Self { Self( sids.split(',') .map(|sid| sid.parse::().unwrap()) .collect(), ) } } impl Display for Assembly { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let n = self.0.len(); write!( f, r#" /// GMT assembly definition pub trait Assembly {{ const N: usize = {0}; const SIDS: [u8; {0}] = {1:?}; fn position() -> Option {{ ::SIDS .into_iter() .position(|sid| sid == ID) }} }}"#, n, self.0 ) } } fn main() -> anyhow::Result<()> { gmt_fem_code_builder::generate_io(env!("CARGO_PKG_NAME"))?; let assembly: Assembly = env::var("ASSEMBLY").map_or(Default::default(), |e| e.into()); let out_dir = env::var_os("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("assembly.rs"); fs::write(dest_path, assembly.to_string())?; println!("cargo:rerun-if-env-changed=ASSEMBLY"); Ok(()) }