use std::collections::HashMap; use std::env; use std::fs::File; use std::io::Write; use std::path::PathBuf; use std::process::Command; use serde::Deserialize; #[derive(Default, Deserialize)] struct WirelessCredentials { wireless_credentials: HashMap, } fn load_wireless_credentials() -> Option { let yaml_string = String::from_utf8( Command::new("sops") .arg("-d") .arg("secrets.yaml") .output() .ok()? .stdout, ) .ok()?; serde_yaml::from_str(&yaml_string).ok() } fn main() { let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); File::create(out.join("memory.x")) .unwrap() .write_all(include_bytes!("memory.x")) .unwrap(); println!("cargo:rustc-link-search={}", out.display()); let credentials = load_wireless_credentials() .unwrap_or_default() .wireless_credentials; let credential_entries: Vec = credentials .into_iter() .map(|(ssid, password)| format!("(\"{ssid}\", \"{password}\")")) .collect(); let credential_slice_string = format!("[{}]", credential_entries.join(", ")); File::create(out.join("wireless-credentials.rs")) .unwrap() .write_all(credential_slice_string.as_bytes()) .unwrap(); println!("cargo:rerun-if-changed=memory.x"); println!("cargo:rerun-if-changed=secrets.yaml"); println!("cargo:rustc-link-arg-bins=--nmagic"); println!("cargo:rustc-link-arg-bins=-Tlink.x"); println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); }