witty_jsonrpc/transports/
mod.rs1use jsonrpc_ws_server::tokio;
2use std::{
3 fmt,
4 sync::{Arc, Mutex},
5};
6
7use crate::handler::Handler;
8
9#[cfg(feature = "http")]
11pub mod http;
12#[cfg(feature = "tcp")]
14pub mod tcp;
15#[cfg(feature = "ws")]
17pub mod ws;
18
19#[derive(Debug)]
21pub enum TransportError {
22 Address(std::net::AddrParseError),
24 IO(std::io::Error),
26 NoHandler,
28 Unknown,
30 #[cfg(feature = "ws")]
32 WebSockets(Box<crate::transports::ws::Error>),
33}
34
35impl std::error::Error for TransportError {}
36
37impl fmt::Display for TransportError {
38 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39 match self {
40 TransportError::Address(error) => {
41 write!(f, "{}", error)
42 }
43 TransportError::IO(error) => {
44 write!(f, "{}", error)
45 }
46 TransportError::NoHandler => {
47 write!(
48 f,
49 "The operation requires an IO handler, but none is configured yet."
50 )
51 }
52 TransportError::Unknown => {
53 write!(f, "Unknown error.")
54 }
55 #[cfg(feature = "ws")]
56 TransportError::WebSockets(error) => {
57 write!(f, "{}", error)
58 }
59 }
60 }
61}
62
63impl From<std::io::Error> for TransportError {
64 fn from(value: std::io::Error) -> Self {
65 Self::IO(value)
66 }
67}
68
69impl From<std::net::AddrParseError> for TransportError {
70 fn from(value: std::net::AddrParseError) -> Self {
71 Self::Address(value)
72 }
73}
74
75#[cfg(feature = "ws")]
76impl From<crate::transports::ws::Error> for TransportError {
77 fn from(value: crate::transports::ws::Error) -> Self {
78 match value {
79 crate::transports::ws::Error::Io(e) => Self::IO(e),
80 e => Self::WebSockets(Box::new(e)),
81 }
82 }
83}
84
85pub trait Transport<H>
87where
88 H: Handler,
89{
90 fn requires_reset(&self) -> bool;
96 fn running(&self) -> bool;
98 fn set_handler(
100 &mut self,
101 handler: Arc<Mutex<H>>,
102 runtime: Option<tokio::runtime::Handle>,
103 ) -> Result<(), TransportError>;
104 fn start(&mut self) -> Result<(), TransportError>;
108 fn stop(&mut self) -> Result<(), TransportError>;
113}