use clap::ValueEnum;
use crate::host::bootstrap::{
BrowserChoice, DisplayMode, HealthPublic, Takeover, TakeoverProviderKind,
};
use crate::sdk::fetch::RenderMode;
#[derive(ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum RenderArg {
None,
#[default]
Auto,
Always,
}
impl From<RenderArg> for RenderMode {
fn from(v: RenderArg) -> Self {
match v {
RenderArg::None => RenderMode::None,
RenderArg::Auto => RenderMode::Auto,
RenderArg::Always => RenderMode::Always,
}
}
}
#[derive(ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum BrowserArg {
#[default]
Auto,
Chromium,
Chrome,
#[value(name = "chrome-headless-shell", alias = "chrome_shell")]
ChromeHeadlessShell,
#[value(name = "fingerprint-chromium", alias = "fingerprint_chromium")]
FingerprintChromium,
Edge,
Brave,
Lightpanda,
Camoufox,
}
impl From<BrowserArg> for BrowserChoice {
fn from(v: BrowserArg) -> Self {
match v {
BrowserArg::Auto => BrowserChoice::Auto,
BrowserArg::Chromium => BrowserChoice::Chromium,
BrowserArg::Chrome => BrowserChoice::Chrome,
BrowserArg::ChromeHeadlessShell => BrowserChoice::ChromeShell,
BrowserArg::FingerprintChromium => BrowserChoice::FingerprintChromium,
BrowserArg::Edge => BrowserChoice::Edge,
BrowserArg::Brave => BrowserChoice::Brave,
BrowserArg::Lightpanda => BrowserChoice::Lightpanda,
BrowserArg::Camoufox => BrowserChoice::Camoufox,
}
}
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum DisplayArg {
Headless,
Headful,
}
impl From<DisplayArg> for DisplayMode {
fn from(v: DisplayArg) -> Self {
match v {
DisplayArg::Headless => DisplayMode::Headless,
DisplayArg::Headful => DisplayMode::Headful,
}
}
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum HealthPublicArg {
Off,
Minimal,
}
impl From<HealthPublicArg> for HealthPublic {
fn from(v: HealthPublicArg) -> Self {
match v {
HealthPublicArg::Off => HealthPublic::Off,
HealthPublicArg::Minimal => HealthPublic::Minimal,
}
}
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum TakeoverProviderArg {
#[value(alias = "none")]
Off,
Kasmvnc,
}
impl TakeoverProviderArg {
pub fn provider_name(self) -> Option<&'static str> {
match self {
TakeoverProviderArg::Off => None,
TakeoverProviderArg::Kasmvnc => Some("kasmvnc"),
}
}
}
impl From<TakeoverProviderArg> for Takeover {
fn from(v: TakeoverProviderArg) -> Self {
match v {
TakeoverProviderArg::Off => Takeover::Off,
TakeoverProviderArg::Kasmvnc => Takeover::On {
provider: TakeoverProviderKind::KasmVnc,
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn value_enum_names_parse() {
for name in ["none", "auto", "always"] {
assert!(RenderArg::from_str(name, true).is_ok(), "{name}");
}
for name in [
"auto",
"chromium",
"chrome",
"chrome-headless-shell",
"chrome_shell",
"fingerprint-chromium",
"fingerprint_chromium",
"edge",
"brave",
"lightpanda",
"camoufox",
] {
assert!(BrowserArg::from_str(name, true).is_ok(), "{name}");
}
assert!(TakeoverProviderArg::from_str("off", true).is_ok());
assert!(TakeoverProviderArg::from_str("none", true).is_ok());
assert!(TakeoverProviderArg::from_str("kasmvnc", true).is_ok());
assert!(BrowserArg::from_str("rocket", true).is_err());
}
#[test]
fn takeover_provider_maps_to_domain() {
assert_eq!(Takeover::from(TakeoverProviderArg::Off), Takeover::Off);
assert_eq!(TakeoverProviderArg::Off.provider_name(), None);
assert_eq!(
TakeoverProviderArg::Kasmvnc.provider_name(),
Some("kasmvnc")
);
assert_eq!(
Takeover::from(TakeoverProviderArg::Kasmvnc),
Takeover::On {
provider: TakeoverProviderKind::KasmVnc
}
);
}
#[test]
fn browser_maps_canonical_and_alias() {
assert_eq!(
BrowserChoice::from(BrowserArg::ChromeHeadlessShell),
BrowserChoice::ChromeShell
);
assert_eq!(
BrowserChoice::from(BrowserArg::from_str("chrome_shell", true).unwrap()),
BrowserChoice::ChromeShell
);
}
#[test]
fn toggles_map_to_bool_and_modes() {
assert_eq!(RenderMode::from(RenderArg::None), RenderMode::None);
assert_eq!(DisplayMode::from(DisplayArg::Headful), DisplayMode::Headful);
assert_eq!(
HealthPublic::from(HealthPublicArg::Minimal),
HealthPublic::Minimal
);
}
}