use nu_path::{AbsolutePath, AbsolutePathBuf, Path}; use std::io::Read; pub enum Stub<'a> { FileWithContent(&'a str, &'a str), FileWithContentToBeTrimmed(&'a str, &'a str), EmptyFile(&'a str), FileWithPermission(&'a str, bool), } pub fn file_contents(full_path: impl AsRef<AbsolutePath>) -> String { let mut file = std::fs::File::open(full_path.as_ref()).expect("can not open file"); let mut contents = String::new(); file.read_to_string(&mut contents) .expect("can not read file"); contents } pub fn file_contents_binary(full_path: impl AsRef<AbsolutePath>) -> Vec<u8> { let mut file = std::fs::File::open(full_path.as_ref()).expect("can not open file"); let mut contents = Vec::new(); file.read_to_end(&mut contents).expect("can not read file"); contents } pub fn line_ending() -> String { #[cfg(windows)] { String::from("\r\n") } #[cfg(not(windows))] { String::from("\n") } } pub fn files_exist_at(files: &[impl AsRef<Path>], path: impl AsRef<AbsolutePath>) -> bool { let path = path.as_ref(); files.iter().all(|f| path.join(f.as_ref()).exists()) } pub fn executable_path() -> AbsolutePathBuf { let mut path = binaries(); path.push("nu"); path } pub fn installed_nu_path() -> AbsolutePathBuf { let path = std::env::var_os(crate::NATIVE_PATH_ENV_VAR); if let Ok(path) = which::which_in("nu", path, ".") { AbsolutePathBuf::try_from(path).expect("installed nushell path is absolute") } else { executable_path() } } pub fn root() -> AbsolutePathBuf { let manifest_dir = if let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") { AbsolutePathBuf::try_from(manifest_dir).expect("CARGO_MANIFEST_DIR is not an absolute path") } else { AbsolutePathBuf::try_from(env!("CARGO_MANIFEST_DIR")) .expect("CARGO_MANIFEST_DIR is not an absolute path") }; let test_path = manifest_dir.join("Cargo.lock"); if test_path.exists() { manifest_dir } else { manifest_dir .parent() .expect("Couldn't find the debug binaries directory") .parent() .expect("Couldn't find the debug binaries directory") .into() } } pub fn binaries() -> AbsolutePathBuf { let build_target = std::env::var("CARGO_BUILD_TARGET").unwrap_or_default(); let profile = if let Ok(env_profile) = std::env::var("NUSHELL_CARGO_PROFILE") { env_profile } else if cfg!(debug_assertions) { "debug".into() } else { "release".into() }; std::env::var("CARGO_TARGET_DIR") .ok() .and_then(|p| AbsolutePathBuf::try_from(p).ok()) .unwrap_or_else(|| root().join("target")) .join(build_target) .join(profile) } pub fn fixtures() -> AbsolutePathBuf { let mut path = root(); path.push("tests"); path.push("fixtures"); path } pub fn assets() -> AbsolutePathBuf { let mut path = root(); path.push("tests"); path.push("assets"); path } pub fn in_directory(path: impl AsRef<nu_path::Path>) -> AbsolutePathBuf { root().join(path) }