1pub 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#[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}