#[macro_use]
extern crate log;
pub use crate::handler::JrpcHandler;
pub use crate::method::JrpcMethodTrait;
pub use crate::parser::{JrpcError, JrpcErrorEnum, JrpcRequest, JrpcResponse, JrpcResponseParam};
pub use futures;
pub use serde_json::error::Error as JsonError;
pub use serde_json::Value as JsonValue;
use std::fmt;
use std::io::Error as IoError;
pub mod handler;
pub mod method;
pub mod parser;
#[derive(Debug)]
pub enum ErrorVariant {
RwLockPoisoned,
MethodSignatureNotFound(String),
JsonParseError(JsonError),
InvalidJsonRpcVersion,
InvalidJsonRpcId,
ResponseCannotContainResultAndError,
ResponseMustContainResultOrError,
NoRequestProvided,
IoError(IoError),
InternalError,
InternalErrorMessage(String),
}
impl fmt::Display for ErrorVariant {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
ErrorVariant::MethodSignatureNotFound(s) => {
write!(f, "Method signature '{}' not found", s)
}
ErrorVariant::InternalErrorMessage(s) => write!(f, "An error ocurred: {}", s),
_ => write!(f, "{:?}", self),
}
}
}
#[macro_export]
macro_rules! generate_method {
($struct_identifier:ident, $future:item) => {
#[derive(Debug, Clone)]
pub struct $struct_identifier {
request: Option<JrpcRequest>,
}
impl $struct_identifier {
pub fn new() -> Result<Self, ErrorVariant> {
let request = None;
let some_notification = $struct_identifier {
request,
};
Ok(some_notification)
}
pub fn get_request(&self) -> Result<JrpcRequest, ErrorVariant> {
let request = self.request.clone();
request
.map(|r| Ok(r.clone()))
.unwrap_or(Err(ErrorVariant::NoRequestProvided))
}
pub fn set_request(mut self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.request = Some(request);
Ok(self)
}
pub fn clone_with_request(&self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.clone().set_request(request)
}
}
$future
impl<'r> JrpcMethodTrait<'r> for $struct_identifier {
fn generate_future(
&self,
request: JrpcRequest,
) -> Result<
Box<'r + Future<Item = Option<JrpcResponse>, Error = ErrorVariant>>,
ErrorVariant,
> {
Ok(Box::new(self.clone_with_request(request)?))
}
}
};
}
#[macro_export]
macro_rules! generate_method_with_data_and_future {
($struct_identifier:ident, $data:ty, $future:item) => {
#[derive(Debug, Clone)]
pub struct $struct_identifier {
request: Option<JrpcRequest>,
data: $data,
}
impl $struct_identifier {
pub fn new(data: $data) -> Result<Self, ErrorVariant> {
let request = None;
let some_notification = $struct_identifier {
request,
data,
};
Ok(some_notification)
}
pub fn get_data(&self) -> &$data {
&self.data
}
pub fn get_request(&self) -> Result<JrpcRequest, ErrorVariant> {
let request = self.request.clone();
request
.map(|r| Ok(r.clone()))
.unwrap_or(Err(ErrorVariant::NoRequestProvided))
}
pub fn set_request(mut self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.request = Some(request);
Ok(self)
}
pub fn clone_with_request(&self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.clone().set_request(request)
}
}
$future
impl<'r> JrpcMethodTrait<'r> for $struct_identifier {
fn generate_future(
&self,
request: JrpcRequest,
) -> Result<
Box<'r + Future<Item = Option<JrpcResponse>, Error = ErrorVariant>>,
ErrorVariant,
> {
Ok(Box::new(self.clone_with_request(request)?))
}
}
};
}
#[macro_export]
macro_rules! generate_method_with_lifetime_data_and_future {
($struct_identifier:ident, $lifetime:tt, $data:ty, $future:item) => {
#[derive(Debug, Clone)]
pub struct $struct_identifier<$lifetime> {
request: Option<JrpcRequest>,
data: $data,
}
impl<$lifetime> $struct_identifier<$lifetime> {
pub fn new(data: $data) -> Result<Self, ErrorVariant> {
let request = None;
let some_notification = $struct_identifier {
request,
data,
};
Ok(some_notification)
}
pub fn get_data(&self) -> &$data {
&self.data
}
pub fn get_request(&self) -> Result<JrpcRequest, ErrorVariant> {
let request = self.request.clone();
request
.map(|r| Ok(r.clone()))
.unwrap_or(Err(ErrorVariant::NoRequestProvided))
}
pub fn set_request(mut self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.request = Some(request);
Ok(self)
}
pub fn clone_with_request(&self, request: JrpcRequest) -> Result<Self, ErrorVariant> {
self.clone().set_request(request)
}
}
$future
impl<$lifetime> JrpcMethodTrait<$lifetime> for $struct_identifier<$lifetime> {
fn generate_future(
&self,
request: JrpcRequest,
) -> Result<
Box<$lifetime + Future<Item = Option<JrpcResponse>, Error = ErrorVariant>>,
ErrorVariant,
> {
Ok(Box::new(self.clone_with_request(request)?))
}
}
};
}