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