geng_net_simple/
app.rs

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}