use std::{env, error::Error, fs, path::Path}; fn main() -> Result<(), Box> { let path = env::var("NIX_PATH")?; let nixpkgs = path.split(':').find(|s| s.starts_with("nixpkgs=")).ok_or("no store path found")?; println!("Nix store path: {}", nixpkgs); recurse(Path::new(&nixpkgs["nixpkgs=".len()..])) } fn recurse(path: &Path) -> Result<(), Box> { if path.metadata()?.is_file() { if path.extension().and_then(|s| s.to_str()) != Some("nix") { return Ok(()); } println!("Checking {}", path.display()); let original = fs::read_to_string(path)?; if original.trim().is_empty() { return Ok(()); } let parsed = rnix::Root::parse(&original).tree().to_string(); if original != parsed { eprintln!("Original input does not match parsed output!"); println!("Input:"); println!("----------"); println!("{}", original); println!("----------"); println!("Output:"); println!("----------"); println!("{}", parsed); println!("----------"); return Err("parsing error".into()); } return Ok(()); } else { for entry in path.read_dir()? { let entry = entry?; if entry.file_type()?.is_symlink() { continue; } recurse(&entry.path())?; } } Ok(()) }