#[non_exhaustive]pub enum RithmicError {
ConnectionFailed(String),
ConnectionClosed,
SendFailed,
EmptyResponse,
RequestTimeout,
RequestRejected(RithmicRequestError),
ProtocolError(String),
InvalidArgument(String),
#[non_exhaustive] NoTradeRoute {
exchange: String,
cached: Vec<String>,
},
HeartbeatTimeout,
ForcedLogout(String),
}Expand description
Typed errors returned by all plant handle methods.
There are three outcomes to handle, not two:
Ok(resp)withresp.error == None— the request succeeded.Ok(resp)withresp.error == Some(..)— the request reached the server and the server turned it down.Err(..)— the request could not be completed: an argument was invalid, the connection dropped, or no response came back.
The second case is the one that catches people out: a request the server
turned down still returns Ok. Code that only checks for Err will treat
it as a success. Check RithmicResponse::error to tell the first two
apart.
login is the one call that returns it as
Err(RequestRejected) instead — both cases are
shown below.
For which of these arrive on the subscription channel instead, and which stop a plant, see the crate-level Error Handling section.
// A `subscribe` the server turns down arrives as `Ok` with `error` set.
match handle.subscribe("ESH6", "CME").await {
Ok(resp) => match &resp.error {
Some(err) => eprintln!("rejected: {err}"),
None => { /* success */ }
},
Err(RithmicError::ConnectionClosed | RithmicError::SendFailed) => {
handle.abort();
// reconnect — see examples/reconnect.rs
}
Err(e) => eprintln!("{e}"),
}
// A `login` the server turns down arrives as `Err`.
if let Err(RithmicError::RequestRejected(err)) = handle.login().await {
eprintln!(
"login rejected code={} msg={}",
err.code.as_deref().unwrap_or("?"),
err.message.as_deref().unwrap_or(""),
);
}Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
ConnectionFailed(String)
WebSocket connection could not be established.
ConnectionClosed
The plant’s WebSocket connection is gone; pending requests will never complete.
SendFailed
WebSocket send failed or timed out after the request was registered.
Treat as a connection-health failure. This error alone does not prove the
actor has shut down; keep-alive failure detection can still emit
crate::rti::messages::RithmicMessage::HeartbeatTimeout or
crate::rti::messages::RithmicMessage::ConnectionError if the
connection is actually dead.
EmptyResponse
Server returned an empty response where at least one was expected.
RequestTimeout
the library no longer times out requests; wrap the call in tokio::time::timeout
No longer produced. The library does not time out requests; a caller
that wants a deadline wraps the call in tokio::time::timeout, which
reports expiry through its own Elapsed rather than this variant.
Removed in 4.0.0.
RequestRejected(RithmicRequestError)
The server turned the request down, with the code and message it gave. Request-level only — not a reason to reconnect.
ProtocolError(String)
A response arrived but could not be turned into a result — a decode failure, or a failure the server reported without a code. Not a reason to reconnect.
An unrecognized template_id does not produce this error; it arrives as
RithmicMessage::UnknownTemplate.
InvalidArgument(String)
A caller-supplied argument is invalid (the message describes which argument and why).
#[non_exhaustive]NoTradeRoute
No route for the order’s exchange and the order named none, so nothing was sent.
Fields
This variant is marked as non-exhaustive
HeartbeatTimeout
Keep-alive detected the connection is dead.
ForcedLogout(String)
Server terminated the session with a reason string.
Implementations§
Source§impl RithmicError
impl RithmicError
Sourcepub fn is_connection_issue(&self) -> bool
pub fn is_connection_issue(&self) -> bool
Returns true when this error reflects a transport/connection-health failure rather than a protocol-level rejection.
Sourcepub fn as_connection_message(&self) -> RithmicMessage
pub fn as_connection_message(&self) -> RithmicMessage
Maps this error to the synthetic subscription RithmicMessage that a
connection-health broadcast should carry. HeartbeatTimeout preserves
the keep-alive signal; every other variant surfaces as ConnectionError.
Trait Implementations§
Source§impl Clone for RithmicError
impl Clone for RithmicError
Source§fn clone(&self) -> RithmicError
fn clone(&self) -> RithmicError
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RithmicError
impl Debug for RithmicError
Source§impl Display for RithmicError
impl Display for RithmicError
impl Eq for RithmicError
Source§impl Error for RithmicError
impl Error for RithmicError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()