use crate::tarantool::error::Error;
use crate::tarantool::tuple::Tuple;
use rmpv::Value;
use serde::de::DeserializeOwned;
use serde::Serialize;
use std::io;
pub mod client;
pub mod route;
pub mod server;
#[derive(Debug)]
pub struct Request {
tup: Tuple,
}
impl Request {
#[allow(clippy::result_large_err)]
pub fn parse<T: DeserializeOwned>(self) -> Result<T, Error> {
fn invalid_format_err() -> Error {
Error::IO(io::Error::other("invalid tuple format"))
}
let arguments = self
.tup
.try_get::<_, rmpv::Value>(2)?
.ok_or_else(invalid_format_err)?;
match arguments {
Value::String(raw_mp_argument) => {
Ok(rmp_serde::from_slice(raw_mp_argument.as_bytes())?)
}
Value::Binary(raw_mp_argument) => Ok(rmp_serde::from_slice(&raw_mp_argument)?),
_ => Err(invalid_format_err()),
}
}
}
#[derive(Debug)]
pub struct Response {
bytes: Vec<u8>,
}
impl Response {
pub fn new<T: Serialize>(serializable: T) -> Response {
Response {
bytes: rmp_serde::to_vec_named(&serializable).unwrap(),
}
}
}
impl<T: Serialize> From<T> for Response {
fn from(serializable: T) -> Self {
Response::new(serializable)
}
}