use std::io::{stdout, Write}; use colored::Colorize; use qsv_tabwriter::TabWriter; use crate::unified::{RunClientNative, RunListenServerNative, RunServerNative}; 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); } fn tasks() -> Vec> { let mut v: Vec> = vec![]; v.push(Box::new(RunClientNative)); v.push(Box::new(RunServerNative)); v.push(Box::new(RunClientWeb)); v.push(Box::new(RunListenServerNative)); v } 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(); }