quad-net 0.1.1

Miniquad friendly network abstractions
Documentation
use nanoserde::DeBin;
use std::sync::{Arc, Mutex};
use std::time::Duration;

#[derive(Default)]
struct ClientState {
    id: Option<usize>,
}

struct World {
    pos: (f32, f32),
    last_edit_id: usize,
    unique_id: usize,
}

pub fn main() -> std::io::Result<()> {
    let world = Arc::new(Mutex::new(World {
        pos: (100.0, 100.0),
        last_edit_id: 0,
        unique_id: 0,
    }));

    quad_net::quad_socket::server::listen(
        "0.0.0.0:8090",
        "0.0.0.0:8091",
        quad_net::quad_socket::server::Settings {
            on_message: {
                let world = world.clone();
                move |mut _out, mut state: &mut ClientState, msg| {
                    let msg: (f32, f32) = DeBin::deserialize_bin(&msg).unwrap();

                    if state.id.is_none() {
                        state.id = Some(world.lock().unwrap().unique_id);
                        world.lock().unwrap().unique_id += 1;
                    }
                    world.lock().unwrap().last_edit_id = state.id.unwrap();
                    world.lock().unwrap().pos = msg;
                }
            },
            on_timer: move |out, _state| {
                let world = world.lock().unwrap();
                out.send_bin(&(world.pos.0, world.pos.1, world.last_edit_id))
                    .unwrap();
            },
            on_disconnect: |_| {},
            timer: Some(Duration::from_millis(100)),
            _marker: std::marker::PhantomData,
        },
    );
    Ok(())
}