diff options
author | hozan23 <hozan23@karyontech.net> | 2024-05-19 22:18:06 +0200 |
---|---|---|
committer | hozan23 <hozan23@karyontech.net> | 2024-05-19 22:18:06 +0200 |
commit | 1c520b20f70ddbdab885ec6c4bf5c87893a26eb4 (patch) | |
tree | 0e51b047e1df0b29fecdc5c39b200d5ecca520ef /jsonrpc/src | |
parent | 41ceed49285b4082477a83d7dda02fbfb3f96b2a (diff) |
jsonrpc: remove jsonrpc_internal crate
Diffstat (limited to 'jsonrpc/src')
-rw-r--r-- | jsonrpc/src/error.rs | 40 | ||||
-rw-r--r-- | jsonrpc/src/lib.rs | 6 | ||||
-rw-r--r-- | jsonrpc/src/service.rs | 64 |
3 files changed, 108 insertions, 2 deletions
diff --git a/jsonrpc/src/error.rs b/jsonrpc/src/error.rs new file mode 100644 index 0000000..7f89729 --- /dev/null +++ b/jsonrpc/src/error.rs @@ -0,0 +1,40 @@ +use thiserror::Error as ThisError; + +pub type Result<T> = std::result::Result<T, Error>; + +/// Represents karyon's jsonrpc Error. +#[derive(ThisError, Debug)] +pub enum Error { + #[error(transparent)] + IO(#[from] std::io::Error), + + #[error("Call Error: code: {0} msg: {1}")] + CallError(i32, String), + + #[error("RPC Method Error: code: {0} msg: {1}")] + RPCMethodError(i32, &'static str), + + #[error("Invalid Params: {0}")] + InvalidParams(&'static str), + + #[error("Invalid Request: {0}")] + InvalidRequest(&'static str), + + #[error(transparent)] + ParseJSON(#[from] serde_json::Error), + + #[error("Invalid Message Error: {0}")] + InvalidMsg(&'static str), + + #[error("Unsupported protocol: {0}")] + UnsupportedProtocol(String), + + #[error("Unexpected Error: {0}")] + General(&'static str), + + #[error(transparent)] + KaryonCore(#[from] karyon_core::error::Error), + + #[error(transparent)] + KaryonNet(#[from] karyon_net::Error), +} diff --git a/jsonrpc/src/lib.rs b/jsonrpc/src/lib.rs index 4ec03cc..3062512 100644 --- a/jsonrpc/src/lib.rs +++ b/jsonrpc/src/lib.rs @@ -68,13 +68,15 @@ mod client; mod codec; +mod error; pub mod message; mod server; +mod service; pub use client::Client; pub use server::Server; -pub use karyon_jsonrpc_internal::{impl_rpc_service, RPCMethod, RPCService}; -pub use karyon_jsonrpc_internal::{Error, Result}; +pub use error::{Error, Result}; pub use karyon_jsonrpc_macro::rpc_impl; pub use karyon_net::Endpoint; +pub use service::{RPCMethod, RPCService}; diff --git a/jsonrpc/src/service.rs b/jsonrpc/src/service.rs new file mode 100644 index 0000000..4c8c4b8 --- /dev/null +++ b/jsonrpc/src/service.rs @@ -0,0 +1,64 @@ +use std::{future::Future, pin::Pin}; + +use crate::Result; + +/// Represents the RPC method +pub type RPCMethod<'a> = Box<dyn Fn(serde_json::Value) -> RPCMethodOutput<'a> + Send + 'a>; +type RPCMethodOutput<'a> = + Pin<Box<dyn Future<Output = Result<serde_json::Value>> + Send + Sync + 'a>>; + +/// Defines the interface for an RPC service. +pub trait RPCService: Sync + Send { + fn get_method<'a>(&'a self, name: &'a str) -> Option<RPCMethod>; + fn name(&self) -> String; +} + +/// Implements the [`RPCService`] trait for a provided type. +/// +/// # Example +/// +/// ``` +/// use serde_json::Value; +/// +/// use karyon_jsonrpc::{Error, impl_rpc_service}; +/// +/// struct Hello {} +/// +/// impl Hello { +/// async fn foo(&self, params: Value) -> Result<Value, Error> { +/// Ok(serde_json::json!("foo!")) +/// } +/// +/// async fn bar(&self, params: Value) -> Result<Value, Error> { +/// Ok(serde_json::json!("bar!")) +/// } +/// } +/// +/// impl_rpc_service!(Hello, foo, bar); +/// +/// ``` +#[macro_export] +macro_rules! impl_rpc_service { + ($t:ty, $($m:ident),*) => { + impl karyon_jsonrpc::RPCService for $t { + fn get_method<'a>( + &'a self, + name: &'a str + ) -> Option<karyon_jsonrpc::RPCMethod> { + match name { + $( + stringify!($m) => { + Some(Box::new(move |params: serde_json::Value| Box::pin(self.$m(params)))) + } + )* + _ => None, + } + + + } + fn name(&self) -> String{ + stringify!($t).to_string() + } + } + }; +} |