// Copyright 2019-2021 Parity Technologies (UK) Ltd. // // Permission is hereby granted, free of charge, to any // person obtaining a copy of this software and associated // documentation files (the "Software"), to deal in the // Software without restriction, including without // limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice // shall be included in all copies or substantial portions // of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT // SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. use crate::v2::ParamsSer; use crate::{Error, Subscription}; use async_trait::async_trait; use serde::de::DeserializeOwned; use serde::Serialize; use serde_json::value::RawValue; /// [JSON-RPC](https://www.jsonrpc.org/specification) client interface that can make requests and notifications. #[async_trait] pub trait Client { /// Send a [notification request](https://www.jsonrpc.org/specification#notification) async fn notification<'a>(&self, method: &'a str, params: ParamsSer<'a>) -> Result<(), Error>; /// Send a [method call request](https://www.jsonrpc.org/specification#request_object). async fn request<'a, R>(&self, method: &'a str, params: ParamsSer<'a>) -> Result where R: DeserializeOwned; /// Send a [batch request](https://www.jsonrpc.org/specification#batch). /// /// The response to batch are returned in the same order as it was inserted in the batch. /// /// Returns `Ok` if all requests in the batch were answered successfully. /// Returns `Error` if any of the requests in batch fails. async fn batch_request<'a, R>(&self, batch: Vec<(&'a str, ParamsSer<'a>)>) -> Result, Error> where R: DeserializeOwned + Default + Clone; } /// [JSON-RPC](https://www.jsonrpc.org/specification) client interface that can make requests, notifications and subscriptions. #[async_trait] pub trait SubscriptionClient: Client { /// Initiate a subscription by performing a JSON-RPC method call where the server responds with /// a `Subscription ID` that is used to fetch messages on that subscription, /// /// The `subscribe_method` and `params` are used to ask for the subscription towards the /// server. /// /// The params may be used as input for the subscription for the server to process. /// /// The `unsubscribe_method` is used to close the subscription /// /// The `Notif` param is a generic type to receive generic subscriptions, see [`Subscription`] for further /// documentation. async fn subscribe<'a, Notif>( &self, subscribe_method: &'a str, params: ParamsSer<'a>, unsubscribe_method: &'a str, ) -> Result, Error> where Notif: DeserializeOwned; /// Register a method subscription, this is used to filter only server notifications that a user is interested in. /// /// The `Notif` param is a generic type to receive generic subscriptions, see [`Subscription`] for further /// documentation. async fn subscribe_to_method<'a, Notif>(&self, method: &'a str) -> Result, Error> where Notif: DeserializeOwned; } /// Marker trait for types that can be serialized as JSON array/sequence. /// /// If your type isn't a sequence, for example `String`, `usize` or similar /// you must insert it in a tuple, slice, array or Vec for it to work. pub trait ToRpcParams: Serialize { /// Serialize the type as a JSON array. fn to_rpc_params(&self) -> Result, serde_json::Error> { serde_json::to_string(&self).map(|json| RawValue::from_string(json).expect("JSON String; qed")) } } impl ToRpcParams for &[P] {} impl ToRpcParams for Vec

{} impl ToRpcParams for [P; N] where [P; N]: Serialize {} macro_rules! tuple_impls { ($($len:expr => ($($n:tt $name:ident)+))+) => { $( impl<$($name: Serialize),+> ToRpcParams for ($($name,)+) {} )+ } } tuple_impls! { 1 => (0 T0) 2 => (0 T0 1 T1) 3 => (0 T0 1 T1 2 T2) 4 => (0 T0 1 T1 2 T2 3 T3) 5 => (0 T0 1 T1 2 T2 3 T3 4 T4) 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5) 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6) 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7) 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8) 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9) 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10) 12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11) 13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12) 14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13) 15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14) 16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15) }