1use super::*;
2
3#[derive(clap::Parser)]
4struct Opt {
5 #[clap(long)]
6 pub server: Option<String>,
7 #[clap(long)]
8 pub connect: Option<String>,
9}
10
11pub fn run<T: Model, G: geng::State>(
12 game_name: &str,
13 #[cfg_attr(target_arch = "wasm32", allow(unused_variables))] model_constructor: impl FnOnce() -> T,
14 game_constructor: impl FnOnce(&Geng, T::PlayerId, Remote<T>) -> G + 'static,
15) {
16 let mut opt: Opt = cli::parse();
17
18 if opt.connect.is_none() && opt.server.is_none() {
19 if cfg!(target_arch = "wasm32") {
20 opt.connect = Some(
21 option_env!("CONNECT")
22 .expect("Set CONNECT compile time env var")
23 .to_owned(),
24 );
25 } else {
26 opt.server = Some("127.0.0.1:1155".to_owned());
27 opt.connect = Some("ws://127.0.0.1:1155".to_owned());
28 }
29 }
30
31 if opt.server.is_some() && opt.connect.is_none() {
32 #[cfg(not(target_arch = "wasm32"))]
33 Server::new(opt.server.as_deref().unwrap(), model_constructor()).run();
34 } else {
35 #[cfg(not(target_arch = "wasm32"))]
36 let server = if let Some(addr) = &opt.server {
37 let server = Server::new(addr, model_constructor());
38 let server_handle = server.handle();
39 let server_thread = std::thread::spawn(move || {
40 server.run();
41 });
42 Some((server_handle, server_thread))
43 } else {
44 None
45 };
46
47 Geng::run(game_name, |geng| async move {
48 let state = ConnectingState::new(&geng, opt.connect.as_deref().unwrap(), {
49 let geng = geng.clone();
50 move |player_id, model| game_constructor(&geng, player_id, model)
51 });
52 geng.run_state(state).await;
53
54 #[cfg(not(target_arch = "wasm32"))]
55 if let Some((server_handle, server_thread)) = server {
56 server_handle.shutdown();
57 server_thread.join().unwrap();
58 }
59 });
60 }
61}