use std::collections::HashMap;
use anyhow::Result;
use async_trait::async_trait;
#[derive(Debug, Clone)]
pub struct SandboxOutput {
pub stdout: String,
pub stderr: String,
pub exit_code: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SandboxKind {
None,
OpenSandbox,
}
impl SandboxKind {
#[must_use]
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"none" | "" => Some(Self::None),
"opensandbox" | "open-sandbox" | "open_sandbox" => Some(Self::OpenSandbox),
_ => None,
}
}
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::None => "none",
Self::OpenSandbox => "opensandbox",
}
}
}
#[async_trait]
pub trait SandboxBackend: Send + Sync {
async fn exec(
&self,
cmd: &str,
env: &HashMap<String, String>,
cwd: Option<&std::path::Path>,
) -> Result<SandboxOutput>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sandbox_kind_parse_accepts_aliases() {
assert_eq!(SandboxKind::parse("none"), Some(SandboxKind::None));
assert_eq!(SandboxKind::parse(""), Some(SandboxKind::None));
assert_eq!(
SandboxKind::parse("opensandbox"),
Some(SandboxKind::OpenSandbox)
);
assert_eq!(
SandboxKind::parse("Open-Sandbox"),
Some(SandboxKind::OpenSandbox)
);
assert_eq!(
SandboxKind::parse("OPEN_SANDBOX"),
Some(SandboxKind::OpenSandbox)
);
assert_eq!(SandboxKind::parse("unknown"), None);
}
#[test]
fn sandbox_kind_as_str_roundtrip() {
assert_eq!(SandboxKind::None.as_str(), "none");
assert_eq!(SandboxKind::OpenSandbox.as_str(), "opensandbox");
}
}