use clap::Parser;
use crate::{
betting::Chips,
rng_from_seed,
texas::{
agents::{
fishy::FishyTexasAgent,
nitty::NittyTexasAgent,
shovy::ShovyTexasAgent,
simplecli::SimpleCliTexasAgent,
TexasAgent,
},
TexasEngine,
},
};
pub fn parse_agent(s: &str) -> Result<Box<dyn TexasAgent>, String> {
match s {
"simplecli" => Ok(Box::new(SimpleCliTexasAgent::new())),
"fishy" => Ok(Box::new(FishyTexasAgent::new())),
"nitty" => Ok(Box::new(NittyTexasAgent::new())),
"shovy" => Ok(Box::new(ShovyTexasAgent::new())),
_ => Err(format!("unknown player type: {s}")),
}
}
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Args {
#[arg(short, long, default_value = "100")]
pub roll: Chips,
#[arg(short, long, default_value = "1")]
pub ante: Chips,
#[arg(short, long, value_delimiter = ',', default_value = "2,5")]
pub blinds: Vec<Chips>,
#[arg(short, long, value_delimiter = ',', default_value = "simplecli,fishy", num_args = 2..)]
pub players: Vec<String>,
#[arg(short, long)]
pub seed: Option<String>,
}
impl Args {
pub fn run(self) -> Result<(), Box<dyn std::error::Error>> {
let mut rng = rng_from_seed(self.seed);
let mut eng = TexasEngine::new(self.ante, self.blinds);
for agent in self.players.iter().map(|s| parse_agent(s).unwrap()) {
eng.add_agent(agent, self.roll);
}
eng.execute(&mut rng);
Ok(())
}
}