Compare commits

...

1 Commits

Author SHA1 Message Date
David Wiesen
9050947a37 Accept WSL aliases for windows sandbox mode 2026-05-06 13:05:00 -07:00
2 changed files with 36 additions and 2 deletions

View File

@@ -26,6 +26,7 @@ use std::fmt;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
pub use crate::tui_keymap::KeybindingSpec;
@@ -87,13 +88,36 @@ pub enum OAuthCredentialsStoreMode {
Keyring,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "kebab-case")]
#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema)]
pub enum WindowsSandboxModeToml {
Elevated,
Unelevated,
}
impl<'de> Deserialize<'de> for WindowsSandboxModeToml {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
let normalized = value
.trim()
.to_ascii_lowercase()
.replace(['_', ' '], "-");
match normalized.as_str() {
"elevated" => Ok(Self::Elevated),
// Accept WSL-style spellings as compatibility aliases so a bad
// manual edit or stale UI write does not brick the app on startup.
"unelevated" | "wsl" | "wsl2" | "wsl-2" => Ok(Self::Unelevated),
_ => Err(serde::de::Error::unknown_variant(
&value,
&["elevated", "unelevated", "wsl", "wsl2", "wsl-2"],
)),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct WindowsToml {

View File

@@ -86,3 +86,13 @@ fn memories_config_clamps_rate_limit_remaining_threshold() {
}
);
}
#[test]
fn deserialize_windows_sandbox_mode_accepts_wsl_aliases() {
for mode in ["wsl", "wsl2", "wsl-2", "wsL2"] {
let cfg: WindowsToml = toml::from_str(&format!(r#"sandbox = "{mode}""#))
.expect("should deserialize WSL alias as a sandbox mode");
assert_eq!(cfg.sandbox, Some(WindowsSandboxModeToml::Unelevated));
}
}