49 lines
1.5 KiB
Rust
49 lines
1.5 KiB
Rust
use std::{env, error::Error, fs, path::Path};
|
|
|
|
fn main() -> Result<(), Box<dyn Error>> {
|
|
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<dyn Error>> {
|
|
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(())
|
|
}
|