use super::{JsonObject, JsonValue, Reply, Error};
use reply::make_reply;
use futures::future::{IntoFuture, ok, FutureResult, AndThen, Future, BoxFuture};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Method {
List,
Get,
Delete,
Post,
Patch,
Listen,
Action(String),
}
impl Method {
pub fn as_string(&self) -> String {
match self {
&Method::List => "list",
&Method::Get => "get",
&Method::Delete => "delete",
&Method::Post => "post",
&Method::Patch => "patch",
&Method::Listen => "listen",
&Method::Action(ref action) => action,
}.to_string()
}
}
#[derive(Debug)]
pub struct Request {
id: Option<String>,
params: JsonObject,
data: JsonObject,
resource: String,
method: Method,
null: JsonValue,
}
impl Request {
pub fn new(resource: String, method: Method, id: Option<String>, data: JsonObject, params: JsonObject) -> Request {
Request {
resource: resource,
method: method,
id: id,
data: data,
params: params,
null: JsonValue::Null,
}
}
pub fn into_reply(self, reply: JsonObject) -> Reply {
make_reply(self, reply)
}
pub fn method(&self) -> Method {
self.method.clone()
}
pub fn resource(&self) -> &str {
&self.resource
}
pub fn id(&self) -> &Option<String> {
&self.id
}
pub fn params(&self) -> &JsonObject {
&self.params
}
pub fn params_mut(&mut self) -> &mut JsonObject {
&mut self.params
}
pub fn param(&self, key: &str) -> &JsonValue {
self.params.get(key).unwrap_or(&self.null)
}
pub fn set_param(&mut self, key: String, val: JsonValue) {
self.params.insert(key, val);
}
pub fn data(&self) -> &JsonObject {
&self.data
}
pub fn data_mut(&mut self) -> &mut JsonObject {
&mut self.data
}
pub fn boxed(self) -> BoxFuture<Request, Error> {
ok(self).boxed()
}
pub fn and_then<F, B>(self, f: F) -> AndThen<FutureResult<Request, Error>, B, F>
where F: FnOnce(Request) -> B,
B: IntoFuture<Error=Error>
{
ok::<Request, Error>(self).and_then(f)
}
}
impl IntoFuture for Request {
type Item = Request;
type Error = Error;
type Future = FutureResult<Request, Error>;
fn into_future(self) -> Self::Future {
ok(self)
}
}