pub mod http;
use async_trait::async_trait;
pub use serde;
pub use serde_tc_macro::*;
use std::sync::Arc;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error<T: std::error::Error> {
#[error("`{0}`")]
MethodNotFound(String),
#[error("`{0}`")]
ArgumentNotFound(String),
#[error("`{0}`")]
Parse(T),
}
pub trait DispatchStringTuple {
type Error: std::error::Error;
fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>>;
}
pub trait DispatchStringDict {
type Error: std::error::Error;
type Poly;
fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>>;
}
#[async_trait]
pub trait DispatchStringTupleAsync {
type Error: std::error::Error;
async fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>>;
}
#[async_trait]
pub trait DispatchStringDictAsync {
type Error: std::error::Error;
type Poly;
async fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>>;
}
#[async_trait]
impl<T> DispatchStringDictAsync for Arc<T>
where
T: DispatchStringDictAsync + Send + Sync + 'static + ?Sized,
{
type Error = T::Error;
type Poly = T::Poly;
async fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>> {
(self.as_ref() as &T).dispatch(method, arguments).await
}
}
#[async_trait]
impl<T> DispatchStringTupleAsync for Arc<T>
where
T: DispatchStringTupleAsync + Send + Sync + 'static + ?Sized,
{
type Error = T::Error;
async fn dispatch(&self, method: &str, arguments: &str) -> Result<String, Error<Self::Error>> {
(self.as_ref() as &T).dispatch(method, arguments).await
}
}
#[async_trait]
pub trait StubCall: Send + Sync {
type Error;
async fn call(&self, method: &'static str, params: String) -> Result<String, Self::Error>;
}