Skip to main content

orbit_rs/
error.rs

1//! Error type for `orbit-rs`. Deliberately small — this layer has few
2//! independent failure modes.
3
4use std::fmt;
5
6pub type Result<T, E = Error> = std::result::Result<T, E>;
7
8#[derive(Debug)]
9pub enum Error {
10    /// `Fleet::join` was called twice in the same process.
11    AlreadyJoined { name: &'static str },
12
13    /// Fleet size cannot be zero — Orbit's plurality requirement (see VISION §2).
14    EmptyFleet,
15
16    /// A cache frame could not fit into the current ring payload.
17    CacheFrameTooLarge {
18        key_len: usize,
19        value_len: usize,
20        max_payload: usize,
21    },
22
23    /// An event frame could not fit into the current ring payload.
24    EventFrameTooLarge {
25        topic_len: usize,
26        payload_len: usize,
27        max_payload: usize,
28    },
29
30    /// A contest frame could not fit into the current ring payload.
31    ContestFrameTooLarge {
32        subject_len: usize,
33        owner_len: usize,
34        max_payload: usize,
35    },
36
37    /// Shared-memory ring operation failed.
38    Io(std::io::Error),
39}
40
41impl fmt::Display for Error {
42    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43        match self {
44            Self::AlreadyJoined { name } => {
45                write!(f, "fleet '{name}' has already been joined in this process")
46            }
47            Self::EmptyFleet => {
48                write!(f, "fleet_size must be ≥ 1; Orbit needs at least one member")
49            }
50            Self::CacheFrameTooLarge {
51                key_len,
52                value_len,
53                max_payload,
54            } => {
55                write!(
56                    f,
57                    "orbit cache frame too large: key_len={key_len} value_len={value_len} max_payload={max_payload}"
58                )
59            }
60            Self::EventFrameTooLarge {
61                topic_len,
62                payload_len,
63                max_payload,
64            } => {
65                write!(
66                    f,
67                    "orbit event frame too large: topic_len={topic_len} payload_len={payload_len} max_payload={max_payload}"
68                )
69            }
70            Self::ContestFrameTooLarge {
71                subject_len,
72                owner_len,
73                max_payload,
74            } => {
75                write!(
76                    f,
77                    "orbit contest frame too large: subject_len={subject_len} owner_len={owner_len} max_payload={max_payload}"
78                )
79            }
80            Self::Io(err) => write!(f, "orbit io error: {err}"),
81        }
82    }
83}
84
85impl std::error::Error for Error {
86    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
87        match self {
88            Self::Io(err) => Some(err),
89            _ => None,
90        }
91    }
92}