use jsonrpsee_types::SubscriptionId;
use serde::Serialize;
use serde_json::value::RawValue;
pub trait ToRpcParams {
fn to_rpc_params(self) -> Result<Option<Box<RawValue>>, serde_json::Error>;
}
macro_rules! to_rpc_params_impl {
() => {
fn to_rpc_params(self) -> Result<Option<Box<RawValue>>, serde_json::Error> {
let json = serde_json::value::to_raw_value(&self)?;
Ok(Some(json))
}
};
}
impl<P: Serialize> ToRpcParams for &[P] {
to_rpc_params_impl!();
}
impl<P: Serialize> ToRpcParams for Vec<P> {
to_rpc_params_impl!();
}
impl<P, const N: usize> ToRpcParams for [P; N]
where
[P; N]: Serialize,
{
to_rpc_params_impl!();
}
macro_rules! tuple_impls {
($($len:expr => ($($n:tt $name:ident)+))+) => {
$(
impl<$($name: Serialize),+> ToRpcParams for ($($name,)+) {
to_rpc_params_impl!();
}
)+
}
}
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)
}
impl ToRpcParams for Box<RawValue> {
fn to_rpc_params(self) -> Result<Option<Box<RawValue>>, serde_json::Error> {
Ok(Some(self))
}
}
pub trait IdProvider: Send + Sync + std::fmt::Debug {
fn next_id(&self) -> SubscriptionId<'static>;
}
impl<T: IdProvider + ?Sized> IdProvider for Box<T> {
fn next_id(&self) -> SubscriptionId<'static> {
(**self).next_id()
}
}
pub trait ToJson {
fn to_json(&self) -> Result<Box<RawValue>, serde_json::Error>;
}
pub trait MessageEncryption: Send + Sync + std::fmt::Debug + 'static {
fn encrypt(&self, data: &str) -> Result<String, Box<dyn std::error::Error + Send + Sync>>;
fn decrypt(&self, data: &str) -> Result<String, Box<dyn std::error::Error + Send + Sync>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageCryptoErrorPolicy {
SendError,
CloseConnection,
SkipMessage,
}
impl Default for MessageCryptoErrorPolicy {
fn default() -> Self {
Self::SendError
}
}