rpc_it/
lib.rs

1//! # RPC-IT
2//!
3//! Low-level RPC abstraction
4//!
5//! # Concepts
6//!
7//! There are three concepts for RPC handling:
8//!
9//! - Send Notify
10//! - Send Request => Recv Response
11//! - Recv Request
12//!
13//! This library is modeled after the `msgpack-rpc`, but in general, most RPC protocols follow
14//! similar patterns, we may adopt this to other protocols in the future. (JSON-RPC, etc...)
15//!
16//!
17//!
18//!
19//! # Usage
20//!
21//!
22//!
23
24// Re-export crates
25pub extern crate bytes;
26pub extern crate erased_serde;
27pub extern crate futures_util;
28pub extern crate serde;
29
30pub mod codec;
31pub mod codecs;
32pub mod rpc;
33pub mod transport;
34pub mod transports;
35
36#[cfg(feature = "service-macros")]
37pub use rpc_it_macros::service;
38
39#[cfg(feature = "service")]
40pub mod service;
41
42#[cfg(feature = "macros")]
43pub mod __util {
44    use serde::ser::SerializeMap;
45
46    pub fn iter_as_map<'a, I>(iter: I) -> impl serde::Serialize + 'a
47    where
48        I: IntoIterator<Item = (&'a dyn erased_serde::Serialize, &'a dyn erased_serde::Serialize)>
49            + 'a,
50        I::IntoIter: ExactSizeIterator + Clone,
51    {
52        struct IterAsMap<'a, I>(I)
53        where
54            I: Iterator<Item = (&'a dyn erased_serde::Serialize, &'a dyn erased_serde::Serialize)>
55                + ExactSizeIterator
56                + Clone;
57
58        impl<'a, I> serde::Serialize for IterAsMap<'a, I>
59        where
60            I: Iterator<Item = (&'a dyn erased_serde::Serialize, &'a dyn erased_serde::Serialize)>
61                + ExactSizeIterator
62                + Clone,
63        {
64            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
65            where
66                S: serde::Serializer,
67            {
68                let mut map = serializer.serialize_map(Some(self.0.len()))?;
69                for (k, v) in self.0.clone() {
70                    map.serialize_entry(k, v)?;
71                }
72                map.end()
73            }
74        }
75
76        IterAsMap(iter.into_iter())
77    }
78}
79
80pub use rpc::{msg::*, *};
81
82pub use serde::de::IgnoredAny;
83
84#[cfg(feature = "service")]
85pub use service::{
86    ExactMatchRouter, RegisterError, RouteMessageError, Router, Service, ServiceBuilder,
87    TypedRequest, TypedResponse,
88};
89
90/// Create a map from a list of key-value pairs.
91///
92/// This is useful to quickly create a fixed-sized map for serialization.
93#[cfg(feature = "macros")]
94#[macro_export]
95macro_rules! kv_pairs {
96    ($($key:tt = $value:expr),*) => {
97        $crate::__util::iter_as_map([$(
98            (&($key) as &dyn $crate::erased_serde::Serialize,
99             &($value) as &dyn $crate::erased_serde::Serialize)
100        ),*])
101    };
102}