simple-socket 0.1.7

The basic socket server & client for testing
Documentation
use std::net::{IpAddr, Ipv4Addr, SocketAddr};

use simple_socket::{PostServing, SocketClient, SocketServer};

use podo_core_driver::AliveFlag;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
enum Request {
    Hello(String),
    Goodbye(String),
}

#[derive(Debug, Serialize, Deserialize)]
enum Response {
    Echo(String),
}

fn main() {
    const IP_V4: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1);
    const IP: IpAddr = IpAddr::V4(IP_V4);
    const PORT: u16 = 9804;

    let socket = SocketAddr::new(IP, PORT);

    let alive = AliveFlag::new(true);
    let active = AliveFlag::new(false);

    let server_alive = alive.clone();
    let server_active = active.clone();
    let server_thread = std::thread::spawn(move || {
        let handler = |req| match req {
            Request::Hello(name) => Response::Echo(format!("Hello, {}!", name)),
            Request::Goodbye(name) => Response::Echo(format!("Goodbye, {}!", name)),
        };

        let backlog = Default::default();
        let server = SocketServer::<Request, Response>::try_new(socket, backlog).unwrap();
        server
            .run(handler, |server| {
                server_active.start().ok();
                if server_alive.is_running() || server.has_connections() {
                    PostServing::Yield
                } else {
                    PostServing::Stop
                }
            })
            .unwrap();
    });

    while !active.is_running() {
        std::thread::yield_now();
    }

    {
        let name = "foo".to_string();

        let client = SocketClient::<Request, Response>::try_new(socket).unwrap();

        let response = client.request(&Request::Hello(name.clone())).unwrap();
        dbg!(response);

        let response = client.request(&Request::Goodbye(name)).unwrap();
        dbg!(response);
    }

    alive.stop().unwrap();
    server_thread.join().unwrap();
}