use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WireError {
pub error: WireErrorBody,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WireErrorBody {
pub code: String,
pub message: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::serde_helpers::de_present_object"
)]
pub details: Option<serde_json::Value>,
}
impl WireErrorBody {
pub fn supersession_reason(&self) -> Option<crate::error::SupersessionReason> {
self.details
.as_ref()
.and_then(|d| d.get("reason"))
.and_then(|v| serde_json::from_value(v.clone()).ok())
}
pub fn unreachable_ctx_id(&self) -> Option<&str> {
self.details
.as_ref()
.and_then(|d| d.get("unreachable_ctx_id"))
.and_then(|v| v.as_str())
}
pub fn idempotency_key(&self) -> Option<&str> {
self.details
.as_ref()
.and_then(|d| d.get("idempotency_key"))
.and_then(|v| v.as_str())
}
pub fn original_ctx_id(&self) -> Option<&str> {
self.details
.as_ref()
.and_then(|d| d.get("original_ctx_id"))
.and_then(|v| v.as_str())
}
}
impl std::fmt::Display for WireError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}: {}", self.error.code, self.error.message)
}
}