lis2de12 0.1.2

Blocking and async driver for the LIS2DE12 accelerometer with I2C and SPI support
Documentation
#![doc = "Build script that generates the LIS2DE12 register API from the YAML manifest."]

use std::path::PathBuf;
use std::str::FromStr;
use std::{env, fs, io};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=src/lis2de12.yaml");

    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR must be set"));
    let manifest_path = manifest_dir.join("src/lis2de12.yaml");
    let manifest = fs::read_to_string(&manifest_path)?;

    let generated = device_driver_generation::transform_yaml(&manifest, "Lis2de12Device");

    let tokens = proc_macro2::TokenStream::from_str(&generated)
        .map_err(|err| io::Error::other(format!("Failed to parse generated device tokens: {err}")))?;

    let syntax_tree = syn::parse2::<syn::File>(tokens)
        .map_err(|err| io::Error::other(format!("Failed to build syntax tree for generated device: {err}")))?;

    let formatted = prettyplease::unparse(&syntax_tree);

    let mut output = String::new();
    output.push_str("// @generated by build.rs\n");
    output.push_str("// Do not edit this file manually.\n");
    output.push_str("// Source manifest: ");
    output.push_str(&manifest_path.display().to_string());
    output.push_str("\n\n");
    output.push_str(formatted.trim_start_matches('\u{feff}'));
    if !output.ends_with('\n') {
        output.push('\n');
    }

    let out_dir = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR must be set by Cargo"));
    let dest = out_dir.join("lis2de12_device.rs");
    fs::write(dest, output)?;

    Ok(())
}