use std::{fs, path::PathBuf};
pub struct Consent {
path: PathBuf,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Status {
Granted,
Denied,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Persistence {
Save,
Ask,
}
impl Consent {
pub fn new(application_name: &str) -> Self {
let path = dirs_path(application_name);
Self { path }
}
pub fn status(&self) -> Status {
match fs::read_to_string(&self.path) {
Ok(content) => match content.trim() {
"granted" => Status::Granted,
_ => Status::Denied,
},
Err(_) => Status::Denied,
}
}
pub(crate) fn has_stored(&self) -> bool {
self.path.exists()
}
pub fn store(&self, status: Status) -> Result<(), std::io::Error> {
if let Some(parent) = self.path.parent() {
fs::create_dir_all(parent)?;
}
let value = match status {
Status::Granted => "granted",
Status::Denied => "denied",
};
fs::write(&self.path, value)
}
pub fn reset(&self) {
let _ = fs::remove_file(&self.path);
}
}
fn dirs_path(application_name: &str) -> PathBuf {
let base = dirs::config_dir().unwrap_or_else(|| PathBuf::from("."));
base.join(application_name).join("mining-consent")
}
pub struct Reply {
pub consent: Status,
pub persistence: Persistence,
}