use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
const DEFAULT_COLS: u16 = 200;
const DEFAULT_ROWS: u16 = 50;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct ShellsConfig {
pub enabled: bool,
pub visual: VisualMode,
pub terminal: TerminalChoice,
#[schemars(range(min = 1))]
pub default_cols: u16,
#[schemars(range(min = 1))]
pub default_rows: u16,
pub keep_on_exit: bool,
}
impl Default for ShellsConfig {
fn default() -> Self {
Self {
enabled: true,
visual: VisualMode::default(),
terminal: TerminalChoice::default(),
default_cols: DEFAULT_COLS,
default_rows: DEFAULT_ROWS,
keep_on_exit: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
#[serde(rename_all = "snake_case")]
pub enum VisualMode {
#[default]
Current,
Window,
Web,
Headless,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
#[serde(rename_all = "snake_case")]
pub enum TerminalChoice {
#[default]
Auto,
Iterm2,
TerminalApp,
WindowsTerminal,
GnomeTerminal,
Konsole,
Wezterm,
Alacritty,
Kitty,
Xterm,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_default_to_current_tab_in_open_terminal() {
let cfg = ShellsConfig::default();
assert!(cfg.enabled);
assert_eq!(cfg.visual, VisualMode::Current);
assert_eq!(cfg.terminal, TerminalChoice::Auto);
assert_eq!(cfg.default_cols, 200);
assert_eq!(cfg.default_rows, 50);
assert!(cfg.keep_on_exit);
}
#[test]
fn should_roundtrip_visual_mode_as_snake_case() {
let json = serde_json::to_string(&VisualMode::Headless).expect("serialize");
assert_eq!(json, "\"headless\"");
let back: VisualMode = serde_json::from_str("\"current\"").expect("deserialize");
assert_eq!(back, VisualMode::Current);
}
#[test]
fn should_roundtrip_terminal_choice_as_snake_case() {
let json = serde_json::to_string(&TerminalChoice::WindowsTerminal).expect("serialize");
assert_eq!(json, "\"windows_terminal\"");
let back: TerminalChoice = serde_json::from_str("\"gnome_terminal\"").expect("deserialize");
assert_eq!(back, TerminalChoice::GnomeTerminal);
}
#[test]
fn should_reject_unknown_fields() {
let err = serde_json::from_str::<ShellsConfig>(r#"{"bogus": true}"#);
assert!(err.is_err());
}
}