Skip to main content

lisp_rpc_rust_server/
lib.rs

1pub use lisp_rpc_rust_serializer::lisp_rpc_to_str;
2
3pub mod server;
4pub use server::*;
5
6#[derive(Debug, Clone, PartialEq)]
7pub enum RPCType {
8    Msg(String),
9    RPC(String),
10    Map,
11    List,
12
13    /// default value
14    V,
15}
16
17/// need impl for struct
18pub trait ToRPCType: Send + Sync {
19    fn to_rpc_type() -> RPCType
20    where
21        Self: Sized,
22    {
23        RPCType::V
24    }
25
26    /// Object-safe serialization method
27    fn serialize_lisp(&self) -> anyhow::Result<String>;
28}
29
30#[macro_export]
31macro_rules! impl_to_rpc {
32    ($t:ty, $rpc:expr) => {
33        impl ToRPCType for $t {
34            fn to_rpc_type() -> RPCType {
35                $rpc
36            }
37            fn serialize_lisp(&self) -> anyhow::Result<String> {
38                lisp_rpc_to_str(self).map_err(|e| anyhow::anyhow!(e))
39            }
40        }
41    };
42}
43
44macro_rules! impl_to_rpc_basic {
45    ($($t:ty),*) => {
46        $(
47            impl ToRPCType for $t {
48                fn serialize_lisp(&self) -> anyhow::Result<String> {
49                    lisp_rpc_to_str(self).map_err(|e| anyhow::anyhow!(e))
50                }
51            }
52        )*
53    };
54}
55
56impl_to_rpc_basic!(
57    bool,
58    char,
59    i8,
60    i16,
61    i32,
62    i64,
63    isize,
64    u8,
65    u16,
66    u32,
67    u64,
68    usize,
69    f32,
70    f64,
71    String,
72    &str,
73    ()
74);
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn test_primitive_types_impl_to_rpc() {
82        let val_bool = true;
83        let val_char = 'a';
84        let val_i8 = 1i8;
85        let val_i16 = 2i16;
86        let val_i32 = 3i32;
87        let val_i64 = 4i64;
88        let val_isize = 6isize;
89        let val_u8 = 7u8;
90        let val_u16 = 8u16;
91        let val_u32 = 9u32;
92        let val_u64 = 10u64;
93        let val_usize = 12usize;
94        let val_f32 = 13.0f32;
95        let val_f64 = 14.0f64;
96        let val_str = "hello";
97        let val_string = "world".to_string();
98        let val_unit = ();
99
100        assert!(val_bool.serialize_lisp().is_ok());
101        assert!(val_char.serialize_lisp().is_ok());
102        assert!(val_i8.serialize_lisp().is_ok());
103        assert!(val_i16.serialize_lisp().is_ok());
104        assert!(val_i32.serialize_lisp().is_ok());
105        assert!(val_i64.serialize_lisp().is_ok());
106        assert!(val_isize.serialize_lisp().is_ok());
107        assert!(val_u8.serialize_lisp().is_ok());
108        assert!(val_u16.serialize_lisp().is_ok());
109        assert!(val_u32.serialize_lisp().is_ok());
110        assert!(val_u64.serialize_lisp().is_ok());
111        assert!(val_usize.serialize_lisp().is_ok());
112        assert!(val_f32.serialize_lisp().is_ok());
113        assert!(val_f64.serialize_lisp().is_ok());
114        assert!(val_str.serialize_lisp().is_ok());
115        assert!(val_string.serialize_lisp().is_ok());
116        assert!(val_unit.serialize_lisp().is_ok());
117    }
118}