1use std::array::TryFromSliceError;
2
3use thiserror::Error;
4use xmtp_common::{ErrorCode, RetryableError};
5
6#[derive(Clone, Debug, PartialEq, Eq)]
7pub enum ApiEndpoint {
8 Publish,
9 SubscribeGroupMessages,
10 SubscribeWelcomes,
11 UploadKeyPackage,
12 FetchKeyPackages,
13 SendGroupMessages,
14 SendWelcomeMessages,
15 QueryGroupMessages,
16 QueryWelcomeMessages,
17 PublishIdentityUpdate,
18 GetInboxIds,
19 GetIdentityUpdatesV2,
20 VerifyScwSignature,
21 QueryV4Envelopes,
22 PublishEnvelopes,
23 PublishCommitLog,
24 QueryCommitLog,
25 HealthCheck,
26 GetNodes,
27 Path(String),
28 GetNewestGroupMessage,
29}
30
31impl std::fmt::Display for ApiEndpoint {
32 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
33 use ApiEndpoint::*;
34 match self {
35 Publish => write!(f, "publish"),
36 SubscribeGroupMessages => write!(f, "subscribe_group_messages"),
37 SubscribeWelcomes => write!(f, "subscribe_welcomes"),
38 UploadKeyPackage => write!(f, "upload_key_package"),
39 FetchKeyPackages => write!(f, "fetch_key_packages"),
40 SendGroupMessages => write!(f, "send_group_messages"),
41 SendWelcomeMessages => write!(f, "send_welcome_messages"),
42 QueryGroupMessages => write!(f, "query_group_messages"),
43 QueryWelcomeMessages => write!(f, "query_welcome_messages"),
44 PublishIdentityUpdate => write!(f, "publish_identity_update"),
45 GetInboxIds => write!(f, "get_inbox_ids"),
46 GetIdentityUpdatesV2 => write!(f, "get_identity_updates_v2"),
47 VerifyScwSignature => write!(f, "verify_scw_signature"),
48 QueryV4Envelopes => write!(f, "query_v4_envelopes"),
49 PublishEnvelopes => write!(f, "publish_envelopes"),
50 PublishCommitLog => write!(f, "publish_commit_log"),
51 QueryCommitLog => write!(f, "query_commit_log"),
52 HealthCheck => write!(f, "health_check"),
53 GetNodes => write!(f, "get_nodes"),
54 Path(s) => write!(f, "{}", s),
55 GetNewestGroupMessage => write!(f, "get_newest_group_message"),
56 }
57 }
58}
59
60#[derive(thiserror::Error, Debug, ErrorCode)]
65pub enum ConversionError {
66 #[error("missing field {} of type {} during conversion from protobuf", .item, .r#type)]
70 Missing {
71 item: &'static str,
73 r#type: &'static str,
75 },
76 #[error("field {} unspecified", _0)]
80 Unspecified(&'static str),
81 #[error("field {} deprecated", _0)]
85 Deprecated(&'static str),
86 #[error("type {} has invalid length. expected {} got {}", .item, .expected, .got)]
90 InvalidLength {
91 item: &'static str,
93 expected: usize,
95 got: usize,
97 },
98 #[error("type {} invalid. expected {}, got {}", .item, .expected, .got)]
102 InvalidValue {
103 item: &'static str,
105 expected: &'static str,
107 got: String,
109 },
110 #[error("decoding proto {0}")]
114 Decode(#[from] prost::DecodeError),
115 #[error("encoding proto {0}")]
119 Encode(#[from] prost::EncodeError),
120 #[error("Unknown enum value {0}")]
124 UnknownEnumValue(#[from] prost::UnknownEnumValue),
125 #[error(transparent)]
130 EdSignature(#[from] ed25519_dalek::ed25519::Error),
131
132 #[error("{} is invalid: {:?}", .description, .value)]
136 InvalidPublicKey {
137 description: &'static str,
139 value: Option<String>,
141 },
142 #[error("version not supported")]
146 InvalidVersion,
147 #[error(transparent)]
153 OpenMls(#[from] openmls::prelude::Error),
154 #[error(transparent)]
158 Protocol(#[from] openmls::framing::errors::ProtocolMessageError),
159 #[error(transparent)]
163 Builder(#[from] derive_builder::UninitializedFieldError),
164 #[error(transparent)]
168 Slice(#[from] TryFromSliceError),
169}
170
171impl RetryableError for ConversionError {
177 fn is_retryable(&self) -> bool {
178 false
179 }
180}
181
182#[derive(Debug, Error, ErrorCode)]
184pub enum ProtoError {
185 #[error(transparent)]
189 Hex(#[from] hex::FromHexError),
190 #[error(transparent)]
194 Decode(#[from] prost::DecodeError),
195 #[error(transparent)]
199 Encode(#[from] prost::EncodeError),
200 #[error("Open MLS {0}")]
204 OpenMls(#[from] openmls::prelude::Error),
205 #[error(transparent)]
209 MlsProtocolMessage(#[from] openmls::framing::errors::ProtocolMessageError),
210 #[error(transparent)]
214 KeyPackage(#[from] openmls::prelude::KeyPackageVerifyError),
215 #[error("{0} not found")]
219 NotFound(String),
220}