use std::{io, os::unix::fs::MetadataExt, path::Path, process::Command}; pub fn cargo(dir: &Path, args: I) where I: IntoIterator, S: AsRef, { let out = Command::new("cargo") .args(args) .current_dir(dir) .output() .unwrap(); println!("{}", String::from_utf8(out.stderr).unwrap()); println!("{}", String::from_utf8(out.stdout).unwrap()); assert!(out.status.success()); } pub fn ls_ascii(path: &Path, indent: usize) -> io::Result { let mut entries = path.read_dir()?; let mut out = Vec::new(); out.push(format!( "{}{}/", " ".repeat(indent), path.file_name().unwrap().to_string_lossy() )); let indent = indent + 1; let mut files = Vec::new(); let mut dirs = Vec::new(); while let Some(Ok(entry)) = entries.next() { let path = entry.path().to_path_buf(); if entry.file_type()?.is_dir() { dirs.push(path); } else { files.push(path); } } dirs.sort(); files.sort(); for file in files { out.push(format!( "{}{} ({} bytes)", " ".repeat(indent), file.file_name().unwrap().to_string_lossy(), file.metadata().unwrap().size() )); } for path in dirs { out.push(ls_ascii(&path, indent)?); } Ok(out.join("\n")) }