firebase_rs_sdk/data_connect/
error.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::fmt::{self, Display, Formatter};
4
5pub type DataConnectResult<T> = Result<T, DataConnectError>;
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
10pub enum DataConnectErrorCode {
11 InvalidArgument,
13 AlreadyInitialized,
15 NotInitialized,
17 NotSupported,
19 Unauthorized,
21 PartialError,
23 Internal,
25 Other,
27}
28
29impl DataConnectErrorCode {
30 pub fn as_str(&self) -> &'static str {
32 match self {
33 DataConnectErrorCode::InvalidArgument => "data-connect/invalid-argument",
34 DataConnectErrorCode::AlreadyInitialized => "data-connect/already-initialized",
35 DataConnectErrorCode::NotInitialized => "data-connect/not-initialized",
36 DataConnectErrorCode::NotSupported => "data-connect/not-supported",
37 DataConnectErrorCode::Unauthorized => "data-connect/unauthorized",
38 DataConnectErrorCode::PartialError => "data-connect/partial-error",
39 DataConnectErrorCode::Internal => "data-connect/internal",
40 DataConnectErrorCode::Other => "data-connect/other",
41 }
42 }
43}
44
45#[derive(Clone, Debug, Serialize, Deserialize)]
47pub struct DataConnectError {
48 code: DataConnectErrorCode,
49 message: String,
50 operation_failure: Option<DataConnectOperationFailureResponse>,
51}
52
53impl DataConnectError {
54 pub fn new(code: DataConnectErrorCode, message: impl Into<String>) -> Self {
56 Self {
57 code,
58 message: message.into(),
59 operation_failure: None,
60 }
61 }
62
63 pub fn with_operation_failure(
65 message: impl Into<String>,
66 response: DataConnectOperationFailureResponse,
67 ) -> Self {
68 Self {
69 code: DataConnectErrorCode::PartialError,
70 message: message.into(),
71 operation_failure: Some(response),
72 }
73 }
74
75 pub fn code_str(&self) -> &'static str {
77 self.code.as_str()
78 }
79
80 pub fn code(&self) -> DataConnectErrorCode {
82 self.code
83 }
84
85 pub fn message(&self) -> &str {
87 &self.message
88 }
89
90 pub fn operation_failure(&self) -> Option<&DataConnectOperationFailureResponse> {
92 self.operation_failure.as_ref()
93 }
94}
95
96impl Display for DataConnectError {
97 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
98 write!(f, "{} ({})", self.message, self.code.as_str())
99 }
100}
101
102impl std::error::Error for DataConnectError {}
103
104#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
106pub struct DataConnectOperationFailureResponse {
107 pub data: Option<Value>,
109 pub errors: Vec<DataConnectOperationFailureResponseErrorInfo>,
111}
112
113#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
115pub struct DataConnectOperationFailureResponseErrorInfo {
116 pub message: String,
118 pub path: Vec<DataConnectErrorPathSegment>,
120}
121
122#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
124#[serde(untagged)]
125pub enum DataConnectErrorPathSegment {
126 Field(String),
127 Index(i64),
128}
129
130impl Display for DataConnectErrorPathSegment {
131 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
132 match self {
133 DataConnectErrorPathSegment::Field(field) => write!(f, "{}", field),
134 DataConnectErrorPathSegment::Index(idx) => write!(f, "{}", idx),
135 }
136 }
137}
138
139pub fn invalid_argument(message: impl Into<String>) -> DataConnectError {
141 DataConnectError::new(DataConnectErrorCode::InvalidArgument, message)
142}
143
144pub fn unauthorized(message: impl Into<String>) -> DataConnectError {
146 DataConnectError::new(DataConnectErrorCode::Unauthorized, message)
147}
148
149pub fn internal_error(message: impl Into<String>) -> DataConnectError {
151 DataConnectError::new(DataConnectErrorCode::Internal, message)
152}
153
154pub fn operation_error(
156 message: impl Into<String>,
157 response: DataConnectOperationFailureResponse,
158) -> DataConnectError {
159 DataConnectError::with_operation_failure(message, response)
160}