use std::fs::{create_dir, read_dir}; use std::path::PathBuf; use crate::config::Config; use crate::error::*; static DIRS: &[&str] = &[ "bin", "dev", "etc", "home", "lib", "lib64", "proc", "root", "run", "sbin", "sys", "tmp", "usr", "var", "usr/bin", ]; pub fn check(config: &Config) -> MkrootResult<()> { if !&config.root_dir.exists() { return Ok(()); } open(&config.root_dir, config.verbose)?; for dir in DIRS { let mut d = PathBuf::from(&config.root_dir); d.push(&dir); open(&d, config.verbose)?; } Ok(()) } fn open(dir: &PathBuf, verbose: bool) -> MkrootResult<()> { if dir.exists() { if verbose { println!("Checking directory {}", &dir.display()); } if let Err(e) = read_dir(&dir) { return Err(MkrootError::from(format!( "Error opening directory {}: {}", &dir.display(), e ))); } } Ok(()) } pub fn create(config: &Config) -> MkrootResult<()> { mkdir(&config.root_dir, config.verbose)?; for dir in DIRS { let mut d = PathBuf::from(&config.root_dir); d.push(&dir); mkdir(&d, config.verbose)?; } Ok(()) } fn mkdir(dir: &PathBuf, verbose: bool) -> MkrootResult<()> { if !dir.exists() { if verbose { println!("Creating directory {}", &dir.display()); } if let Err(e) = create_dir(&dir) { return Err(MkrootError::from(format!( "Error creating directory {}: {}", &dir.display(), e ))); } } Ok(()) }