use std::io::{stdout, Write};
use colored::Colorize;
use qsv_tabwriter::TabWriter;
use crate::unified::{RunClientNative, RunListenServerNative, RunServerNative, RunSingleplayerNative};
use crate::unified_web::RunClientWeb;
mod unified;
mod unified_web;
mod util;
fn main() {
let args = std::env::args();
let Some(taskname) = args.skip(1).next() else {
print_tasks();
return;
};
// find task
let all_tasks = tasks();
let task = all_tasks.iter().find(|u| u.name() == taskname);
if let Some(task) = task {
println!("{}{}{}", "============ EXECUTING TASK: ".bold().green(), "starkingdoms:".purple(), task.name().cyan());
task.run(std::env::args().skip(2).collect());
} else {
print_tasks();
}
}
pub trait Task {
fn name(&self) -> &'static str;
fn help(&self) -> &'static str;
fn run(&self, args: Vec<String>);
}
fn tasks() -> Vec<Box<dyn Task>> {
vec![
Box::new(RunClientNative),
Box::new(RunServerNative),
Box::new(RunClientWeb),
Box::new(RunListenServerNative),
Box::new(RunSingleplayerNative)
]
}
fn print_tasks() {
println!("{}", "Available tasks".underline());
let mut w = TabWriter::new(stdout());
for task in tasks() {
writeln!(w, "{}\t{}", task.name().cyan(), task.help()).unwrap();
}
w.flush().unwrap();
}