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)),
}
}