use crate::file::{ReadFile, WriteFile};
use capsec_core::cap::Cap;
use capsec_core::cap_provider::CapProvider;
use capsec_core::error::CapSecError;
use capsec_core::permission::{FsRead, FsWrite};
use std::path::Path;
pub fn read(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsRead>,
) -> Result<Vec<u8>, CapSecError> {
let _proof: Cap<FsRead> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::read(path)?)
}
pub fn read_to_string(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsRead>,
) -> Result<String, CapSecError> {
let _proof: Cap<FsRead> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::read_to_string(path)?)
}
pub fn read_dir(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsRead>,
) -> Result<std::fs::ReadDir, CapSecError> {
let _proof: Cap<FsRead> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::read_dir(path)?)
}
pub fn metadata(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsRead>,
) -> Result<std::fs::Metadata, CapSecError> {
let _proof: Cap<FsRead> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::metadata(path)?)
}
pub fn write(
path: impl AsRef<Path>,
contents: impl AsRef<[u8]>,
cap: &impl CapProvider<FsWrite>,
) -> Result<(), CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::write(path, contents)?)
}
pub fn create_dir_all(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsWrite>,
) -> Result<(), CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::create_dir_all(path)?)
}
pub fn remove_file(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsWrite>,
) -> Result<(), CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::remove_file(path)?)
}
pub fn remove_dir_all(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsWrite>,
) -> Result<(), CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(std::fs::remove_dir_all(path)?)
}
pub fn rename(
from: impl AsRef<Path>,
to: impl AsRef<Path>,
cap: &impl CapProvider<FsWrite>,
) -> Result<(), CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&from.as_ref().to_string_lossy())?;
let _proof2: Cap<FsWrite> = cap.provide_cap(&to.as_ref().to_string_lossy())?;
Ok(std::fs::rename(from, to)?)
}
pub fn copy(
from: impl AsRef<Path>,
to: impl AsRef<Path>,
read_cap: &impl CapProvider<FsRead>,
write_cap: &impl CapProvider<FsWrite>,
) -> Result<u64, CapSecError> {
let _read_proof: Cap<FsRead> = read_cap.provide_cap(&from.as_ref().to_string_lossy())?;
let _write_proof: Cap<FsWrite> = write_cap.provide_cap(&to.as_ref().to_string_lossy())?;
Ok(std::fs::copy(from, to)?)
}
pub fn open(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsRead>,
) -> Result<ReadFile, CapSecError> {
let _proof: Cap<FsRead> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(ReadFile::new(std::fs::File::open(path)?))
}
pub fn create(
path: impl AsRef<Path>,
cap: &impl CapProvider<FsWrite>,
) -> Result<WriteFile, CapSecError> {
let _proof: Cap<FsWrite> = cap.provide_cap(&path.as_ref().to_string_lossy())?;
Ok(WriteFile::new(std::fs::File::create(path)?))
}