use std::path::PathBuf; #[derive(Debug)] pub enum SandboxError { HomeNotSet, BwrapNotFound, CommandNotFound(PathBuf), CommandNotExecutable(PathBuf), RwPathMissing(PathBuf), RoPathMissing(PathBuf), ChdirMissing(PathBuf), CurrentDirUnavailable(std::io::Error), GlobPattern(glob::PatternError), Io(std::io::Error), } impl std::fmt::Display for SandboxError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::HomeNotSet => write!( f, "$HOME is not set; cannot determine which paths to protect" ), Self::BwrapNotFound => write!( f, "bwrap not found; install bubblewrap (e.g. `apt install bubblewrap` or `pacman -S bubblewrap`)" ), Self::CommandNotFound(p) => write!(f, "command not found: {}", p.display()), Self::CommandNotExecutable(p) => { write!(f, "command is not executable: {}", p.display()) } Self::RwPathMissing(p) => write!(f, "--rw path does not exist: {}", p.display()), Self::RoPathMissing(p) => write!(f, "--ro path does not exist: {}", p.display()), Self::ChdirMissing(p) => write!(f, "--chdir path does not exist: {}", p.display()), Self::CurrentDirUnavailable(e) => write!(f, "cannot determine current directory: {e}"), Self::GlobPattern(e) => write!(f, "invalid glob pattern: {e}"), Self::Io(e) => write!(f, "I/O error: {e}"), } } } impl std::error::Error for SandboxError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { Self::CurrentDirUnavailable(e) => Some(e), Self::GlobPattern(e) => Some(e), Self::Io(e) => Some(e), _ => None, } } } impl From for SandboxError { fn from(e: std::io::Error) -> Self { Self::Io(e) } } impl From for SandboxError { fn from(e: glob::PatternError) -> Self { Self::GlobPattern(e) } }