use serde::de::DeserializeOwned; use serde::Serialize; use std::ffi::OsStr; use std::fs::{self, File}; use std::io::Read; use std::path::Path; use walkdir::{DirEntry, WalkDir}; use crate::error::{Error, Result}; use crate::report::BenchmarkId; pub fn load(path: &P) -> Result where A: DeserializeOwned, P: AsRef, { let path = path.as_ref(); let mut f = File::open(path).map_err(|inner| Error::AccessError { inner, path: path.to_owned(), })?; let mut string = String::new(); let _ = f.read_to_string(&mut string); let result: A = serde_json::from_str(string.as_str()).map_err(|inner| Error::SerdeError { inner, path: path.to_owned(), })?; Ok(result) } pub fn is_dir

(path: &P) -> bool where P: AsRef, { let path: &Path = path.as_ref(); path.is_dir() } pub fn mkdirp

(path: &P) -> Result<()> where P: AsRef, { fs::create_dir_all(path.as_ref()).map_err(|inner| Error::AccessError { inner, path: path.as_ref().to_owned(), })?; Ok(()) } pub fn cp(from: &Path, to: &Path) -> Result<()> { fs::copy(from, to).map_err(|inner| Error::CopyError { inner, from: from.to_owned(), to: to.to_owned(), })?; Ok(()) } pub fn save(data: &D, path: &P) -> Result<()> where D: Serialize, P: AsRef, { let buf = serde_json::to_string(&data).map_err(|inner| Error::SerdeError { path: path.as_ref().to_owned(), inner, })?; save_string(&buf, path) } pub fn save_string

(data: &str, path: &P) -> Result<()> where P: AsRef, { use std::io::Write; File::create(path) .and_then(|mut f| f.write_all(data.as_bytes())) .map_err(|inner| Error::AccessError { inner, path: path.as_ref().to_owned(), })?; Ok(()) } pub fn list_existing_benchmarks

(directory: &P) -> Result> where P: AsRef, { fn is_benchmark(entry: &DirEntry) -> bool { // Look for benchmark.json files inside folders named "new" (because we want to ignore // the baselines) entry.file_name() == OsStr::new("benchmark.json") && entry.path().parent().unwrap().file_name().unwrap() == OsStr::new("new") } let mut ids = vec![]; for entry in WalkDir::new(directory) .into_iter() // Ignore errors. .filter_map(::std::result::Result::ok) .filter(is_benchmark) { let id: BenchmarkId = load(entry.path())?; ids.push(id); } Ok(ids) }