1use rmcp::ErrorData;
2
3#[derive(Debug, thiserror::Error)]
8pub enum BusError {
9 #[error("not found: {0}")]
10 NotFound(String),
11
12 #[error("invalid input: {0}")]
13 Invalid(String),
14
15 #[error("conflict: {0}")]
16 Conflict(String),
17
18 #[error("unauthenticated: {0}")]
19 Unauthenticated(String),
20
21 #[error("forbidden: {0}")]
24 Forbidden(String),
25
26 #[error("database error: {0}")]
27 Db(#[from] sqlx::Error),
28}
29
30impl BusError {
31 pub fn not_found(msg: impl Into<String>) -> Self {
32 Self::NotFound(msg.into())
33 }
34 pub fn invalid(msg: impl Into<String>) -> Self {
35 Self::Invalid(msg.into())
36 }
37 pub fn conflict(msg: impl Into<String>) -> Self {
38 Self::Conflict(msg.into())
39 }
40 pub fn forbidden(msg: impl Into<String>) -> Self {
41 Self::Forbidden(msg.into())
42 }
43}
44
45impl From<BusError> for ErrorData {
57 fn from(err: BusError) -> Self {
58 match err {
59 BusError::NotFound(m) => ErrorData::invalid_params(format!("not found: {m}"), None),
60 BusError::Invalid(m) => ErrorData::invalid_params(m, None),
61 BusError::Conflict(m) => ErrorData::invalid_params(format!("conflict: {m}"), None),
62 BusError::Unauthenticated(m) => {
63 ErrorData::invalid_request(format!("unauthenticated: {m}"), None)
64 }
65 BusError::Forbidden(m) => ErrorData::invalid_request(format!("forbidden: {m}"), None),
66 BusError::Db(e) => {
67 tracing::error!(error = %e, "database error");
69 ErrorData::internal_error("database error", None)
70 }
71 }
72 }
73}
74
75pub type BusResult<T> = Result<T, BusError>;