use super::permssion_conver_util::permission_to_digit;
use std::fmt::{Display, Formatter};
#[derive(Debug, Eq, PartialEq)]
pub struct ModeParser {
partial_mode: u32,
read: char,
write: char,
execute: char,
}
impl ModeParser {
fn reset_partial_mode(&mut self) {
let digit_of_permission = permission_to_digit(&self.to_string()).parse::<u32>();
self.set_partial_mode(digit_of_permission.unwrap());
}
pub fn set_partial_mode(&mut self, partial_mode: u32) {
self.partial_mode = partial_mode;
}
pub fn get_partial_mode(&self) -> u32 {
self.partial_mode
}
pub fn set_read(&mut self, read: char) {
self.read = read;
self.reset_partial_mode();
}
pub fn set_write(&mut self, write: char) {
self.write = write;
self.reset_partial_mode();
}
pub fn set_execute(&mut self, execute: char) {
self.execute = execute;
self.reset_partial_mode();
}
pub fn get_read(&self) -> char {
self.read
}
pub fn get_write(&self) -> char {
self.write
}
pub fn get_execute(&self) -> char {
self.execute
}
}
impl From<&str> for ModeParser {
fn from(perm: &str) -> Self {
let read = perm.chars().next().unwrap_or('-');
let write = perm.chars().nth(1).unwrap_or('-');
let execute = perm.chars().nth(2).unwrap_or('-');
let mode = permission_to_digit(&format!("{}{}{}", read, write, execute))
.parse::<u32>()
.unwrap_or(0);
Self {
partial_mode: mode,
read,
write,
execute,
}
}
}
impl From<String> for ModeParser {
fn from(perm: String) -> Self {
Self::from(perm.as_str())
}
}
impl Display for ModeParser {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}{}{}", self.read, self.write, self.execute)
}
}