openlegends-server 0.3.0

OpenLegends Game Server
Documentation
mod error;
use error::Error;
use openlegends_server::api::*;

pub enum Request {
    ServerAbout,
    ServerStatus,
    UserRegister(String),
}

impl Request {
    pub fn from_utf8(buffer: &[u8]) -> Result<Self, Error> {
        match header(buffer) {
            Ok((header, offset)) => match header.as_str() {
                server::about::request::HEADER => Ok(Self::ServerAbout),
                server::status::request::HEADER => Ok(Self::ServerStatus),
                user::register::request::HEADER => Ok(Self::UserRegister(data(buffer, offset)?)),
                _ => Err(Error::Route),
            },
            Err(e) => Err(e),
        }
    }
}

fn header(buffer: &[u8]) -> Result<(String, usize), Error> {
    match buffer.windows(2).position(|window| window == b"\r\n") {
        Some(size) => match buffer.get(0..size) {
            Some(header) => Ok((from_utf8(header)?, size)),
            None => Err(Error::Protocol),
        },
        None => Err(Error::Header),
    }
}

fn data(buffer: &[u8], offset: usize) -> Result<String, Error> {
    match buffer.get(offset..) {
        Some(data) => Ok(from_utf8(data)?),
        None => Err(Error::Protocol),
    }
}

fn from_utf8(buffer: &[u8]) -> Result<String, Error> {
    match String::from_utf8(buffer.to_vec()) {
        Ok(result) => Ok(result),
        Err(e) => Err(Error::Utf8(e)),
    }
}