1 //! ### Transport agnostic jsonrpc library.
2 //!
3 //! Right now it supports only server side handling requests.
4 //!
5 //! ```rust
6 //! use jsonrpc_core::IoHandler;
7 //! use jsonrpc_core::Value;
8 //! let mut io = IoHandler::new();
9 //! io.add_sync_method("say_hello", |_| {
10 //!     Ok(Value::String("Hello World!".into()))
11 //! });
12 //!
13 //! let request = r#"{"jsonrpc": "2.0", "method": "say_hello", "params": [42, 23], "id": 1}"#;
14 //! let response = r#"{"jsonrpc":"2.0","result":"Hello World!","id":1}"#;
15 //!
16 //! assert_eq!(io.handle_request_sync(request), Some(response.to_string()));
17 //! ```
18 
19 #![deny(missing_docs)]
20 
21 use std::pin::Pin;
22 
23 #[macro_use]
24 extern crate log;
25 #[macro_use]
26 extern crate serde_derive;
27 
28 #[cfg(feature = "futures")]
29 pub use futures;
30 #[cfg(feature = "futures-executor")]
31 pub use futures_executor;
32 pub use futures_util;
33 
34 #[doc(hidden)]
35 pub extern crate serde;
36 #[doc(hidden)]
37 pub extern crate serde_json;
38 
39 mod calls;
40 mod io;
41 
42 pub mod delegates;
43 pub mod middleware;
44 pub mod types;
45 
46 /// A Result type.
47 pub type Result<T> = std::result::Result<T, Error>;
48 
49 /// A `Future` trait object.
50 pub type BoxFuture<T> = Pin<Box<dyn std::future::Future<Output = T> + Send>>;
51 
52 pub use crate::calls::{
53 	Metadata, RemoteProcedure, RpcMethod, RpcMethodSimple, RpcMethodSync, RpcNotification, RpcNotificationSimple,
54 	WrapFuture,
55 };
56 pub use crate::delegates::IoDelegate;
57 pub use crate::io::{
58 	Compatibility, FutureOutput, FutureResponse, FutureResult, FutureRpcResult, IoHandler, IoHandlerExtension,
59 	MetaIoHandler,
60 };
61 pub use crate::middleware::{Middleware, Noop as NoopMiddleware};
62 pub use crate::types::*;
63 
64 use serde_json::Error as SerdeError;
65 
66 /// workaround for https://github.com/serde-rs/json/issues/505
67 /// Arbitrary precision confuses serde when deserializing into untagged enums,
68 /// this is a workaround
serde_from_str<'a, T>(input: &'a str) -> std::result::Result<T, SerdeError> where T: serde::de::Deserialize<'a>,69 pub fn serde_from_str<'a, T>(input: &'a str) -> std::result::Result<T, SerdeError>
70 where
71 	T: serde::de::Deserialize<'a>,
72 {
73 	if cfg!(feature = "arbitrary_precision") {
74 		let val = serde_json::from_str::<Value>(input)?;
75 		T::deserialize(val)
76 	} else {
77 		serde_json::from_str::<T>(input)
78 	}
79 }
80