zookeeper_client/proto/
error_code.rs

1use bytes::BufMut;
2use num_enum::{IntoPrimitive, TryFromPrimitive, TryFromPrimitiveError};
3
4use crate::error::Error;
5use crate::record::{InvalidData, ReadingBuf, SerializableRecord, StaticRecord, UnsafeBuf, UnsafeRead};
6
7impl From<ErrorCode> for Error {
8    fn from(ec: ErrorCode) -> Error {
9        use ErrorCode::*;
10        match ec {
11            Ok => Error::UnexpectedErrorCode(0),
12            MarshallingError => Error::MarshallingError,
13            Unimplemented => Error::Unimplemented,
14            BadArguments => Error::BadArguments(&"server error"),
15            NoNode => Error::NoNode,
16            NoAuth => Error::NoAuth,
17            BadVersion => Error::BadVersion,
18            NoChildrenForEphemerals => Error::NoChildrenForEphemerals,
19            NodeExists => Error::NodeExists,
20            NotEmpty => Error::NotEmpty,
21            SessionExpired => Error::SessionExpired,
22            InvalidAcl => Error::InvalidAcl,
23            AuthFailed | SessionClosedRequireSaslAuth => Error::AuthFailed,
24            SessionMoved => Error::SessionMoved,
25            NotReadOnly => Error::NotReadOnly,
26            NoWatcher => Error::NoWatcher,
27            ReconfigDisabled => Error::ReconfigDisabled,
28            QuotaExceeded => Error::QuotaExceeded,
29            Throttled => Error::Throttled,
30        }
31    }
32}
33
34#[repr(i32)]
35#[derive(Copy, Clone, Debug, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
36pub enum ErrorCode {
37    Ok = 0,
38    MarshallingError = -5,
39    Unimplemented = -6,
40    BadArguments = -8,
41    NoNode = -101,
42    NoAuth = -102,
43    BadVersion = -103,
44    NoChildrenForEphemerals = -108,
45    NodeExists = -110,
46    NotEmpty = -111,
47    SessionExpired = -112,
48    InvalidAcl = -114,
49    AuthFailed = -115,
50    SessionMoved = -118,
51    NotReadOnly = -119,
52    NoWatcher = -121,
53    ReconfigDisabled = -123,
54    SessionClosedRequireSaslAuth = -124,
55    QuotaExceeded = -125,
56    Throttled = -127,
57}
58
59impl From<TryFromPrimitiveError<ErrorCode>> for Error {
60    fn from(err: TryFromPrimitiveError<ErrorCode>) -> Error {
61        Error::UnexpectedErrorCode(err.number)
62    }
63}
64
65impl SerializableRecord for ErrorCode {
66    fn serialize(&self, buf: &mut dyn BufMut) {
67        let ec = i32::from(*self);
68        ec.serialize(buf);
69    }
70}
71
72impl StaticRecord for ErrorCode {
73    fn record_len() -> usize {
74        4
75    }
76}
77
78impl UnsafeRead<'_> for ErrorCode {
79    type Error = InvalidData;
80
81    unsafe fn read(buf: &mut ReadingBuf<'_>) -> Result<Self, InvalidData> {
82        match ErrorCode::try_from(buf.get_unchecked_i32()) {
83            Ok(ec) => Ok(ec),
84            Err(err) => Err(InvalidData::UnexpectedErrorCode(err.number)),
85        }
86    }
87}