#![deny(clippy::print_stdout, clippy::print_stderr)]
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
if let Some(code) = newt_core::maybe_dispatch() {
std::process::exit(code);
}
newt_core::tty::enter_protocol_mode();
tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.init();
let persona = parse_persona_arg(std::env::args());
newt_mcp_server::run_stdio(persona.as_deref()).await
}
fn parse_persona_arg(args: impl Iterator<Item = String>) -> Option<String> {
let mut args = args.peekable();
while let Some(arg) = args.next() {
if let Some(value) = arg.strip_prefix("--persona=") {
return Some(value.to_string());
}
if arg == "--persona" {
return args.next();
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_space_and_equals_forms() {
assert_eq!(
parse_persona_arg(
["newt-mcp-server", "--persona", "coach"]
.map(String::from)
.into_iter()
),
Some("coach".to_string())
);
assert_eq!(
parse_persona_arg(
["newt-mcp-server", "--persona=coach"]
.map(String::from)
.into_iter()
),
Some("coach".to_string())
);
}
#[test]
fn absent_or_dangling_flag_is_none() {
assert_eq!(
parse_persona_arg(["newt-mcp-server"].map(String::from).into_iter()),
None
);
assert_eq!(
parse_persona_arg(
["newt-mcp-server", "--persona"]
.map(String::from)
.into_iter()
),
None
);
}
}