use std::{ffi::OsStr, fs::File, path::Path, path::PathBuf};
use crate::errors::Error;
pub fn open<S>(path: &S) -> Result<File, Error>
where
S: AsRef<Path> + ?Sized,
{
File::open(path).map_err(|e| {
let p: &Path = path.as_ref();
Error::FileOpen(e, p.to_string_lossy().to_string())
})
}
pub fn create<S>(path: &S) -> Result<File, Error>
where
S: AsRef<Path> + ?Sized,
{
File::create(path).map_err(|e| {
let p: &Path = path.as_ref();
Error::FileCreate(e, p.to_string_lossy().to_string())
})
}
pub fn canonicalize<S>(path: &S) -> Result<PathBuf, Error>
where
S: AsRef<Path> + ?Sized,
{
std::fs::canonicalize(path).map_err(|e| {
let p: &Path = path.as_ref();
Error::FileCanonicalize(e, p.to_string_lossy().to_string())
})
}
pub fn set_current_dir<S>(path: &S) -> Result<(), Error>
where
S: AsRef<Path>,
{
std::env::set_current_dir(path).map_err(|e| {
let p: &Path = path.as_ref();
Error::Cwd(e, p.to_string_lossy().to_string())
})
}
pub fn extension(path: &str) -> Option<&str> {
Path::new(path).extension().and_then(OsStr::to_str)
}
#[cfg(test)]
mod test {
#![allow(clippy::unwrap_used)]
use crate::errors::Error;
#[test]
fn set_current_dir() -> Result<(), Error> {
let path = std::env::current_dir().unwrap();
super::set_current_dir(&path)?;
let path = path.join("really.does.not.exist");
let p = path.to_string_lossy().to_string();
let r = super::set_current_dir(&path);
assert!(r.is_err());
let err = r.err().unwrap();
assert!(matches!(err, Error::Cwd(_, bad) if bad == p));
Ok(())
}
#[test]
fn canonicalize() -> Result<(), Error> {
let path = std::env::current_dir().unwrap();
let path = path.join("Cargo.toml");
let path = super::canonicalize(&path)?;
assert!(path.exists());
let path = path.join("really.does.not.exist");
let p = path.to_string_lossy().to_string();
let path = super::canonicalize(&path);
assert!(path.is_err());
let err = path.err().unwrap();
assert!(matches!(err, Error::FileCanonicalize(_, bad) if bad == p));
Ok(())
}
#[test]
fn create() -> Result<(), Error> {
let path = std::env::current_dir().unwrap();
let path = path.join(".a.file.that.will.get.deleted");
super::create(&path)?;
let path = path.join("this.does.not.work");
let p = path.to_string_lossy().to_string();
let r = super::create(&path);
assert!(r.is_err());
let err = r.err().unwrap();
assert!(matches!(err, Error::FileCreate(_, bad) if bad == p));
Ok(())
}
#[test]
fn open() -> Result<(), Error> {
let path = std::env::current_dir().unwrap();
let path = path.join("Cargo.toml");
super::open(&path)?;
let path = path.join("this.does.not.work");
let p = path.to_string_lossy().to_string();
let r = super::open(&path);
assert!(r.is_err());
let err = r.err().unwrap();
assert!(matches!(err, Error::FileOpen(_, bad) if bad == p));
Ok(())
}
}