use std::net::IpAddr;
use std::path::PathBuf;
use clap::{Parser, ValueEnum};
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogFormat {
Text,
Json,
}
#[derive(Parser, Debug, Clone)]
#[command(name = "tty-web", about = "Web-based terminal emulator")]
pub struct Config {
#[arg(long, default_value = "127.0.0.1", env = "TTY_WEB_ADDRESS")]
pub address: IpAddr,
#[arg(long, default_value_t = 9090, env = "TTY_WEB_PORT")]
pub port: u16,
#[arg(long, default_value = "/bin/bash", env = "TTY_WEB_SHELL")]
pub shell: String,
#[arg(long, default_value = "info", env = "TTY_WEB_LOG_LEVEL")]
pub log_level: String,
#[arg(long, default_value = "text", env = "TTY_WEB_LOG_FORMAT")]
pub log_format: LogFormat,
#[arg(long, env = "TTY_WEB_PWD")]
pub pwd: Option<PathBuf>,
#[arg(long, default_value_t = 256, env = "TTY_WEB_SCROLLBACK_LIMIT")]
pub scrollback_limit: usize,
#[arg(long, default_value_t = 60, env = "TTY_WEB_ORPHAN_TIMEOUT")]
pub orphan_timeout: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_values() {
let config = Config::parse_from(["tty-web"]);
assert_eq!(config.address, "127.0.0.1".parse::<IpAddr>().unwrap());
assert_eq!(config.port, 9090);
assert_eq!(config.shell, "/bin/bash");
assert_eq!(config.log_level, "info");
assert_eq!(config.log_format, LogFormat::Text);
assert_eq!(config.pwd, None);
assert_eq!(config.scrollback_limit, 256);
assert_eq!(config.orphan_timeout, 60);
}
#[test]
fn test_custom_values() {
let config = Config::parse_from([
"tty-web",
"--port",
"8080",
"--shell",
"/bin/sh",
"--address",
"0.0.0.0",
"--log-level",
"debug",
"--log-format",
"json",
]);
assert_eq!(config.address, "0.0.0.0".parse::<IpAddr>().unwrap());
assert_eq!(config.port, 8080);
assert_eq!(config.shell, "/bin/sh");
assert_eq!(config.log_level, "debug");
assert_eq!(config.log_format, LogFormat::Json);
}
#[test]
fn test_pwd_flag() {
let config = Config::parse_from(["tty-web", "--pwd", "/tmp"]);
assert_eq!(config.pwd, Some(PathBuf::from("/tmp")));
}
}