mas_matrix_synapse/
error.rsuse std::fmt::Display;
use async_trait::async_trait;
use serde::Deserialize;
use thiserror::Error;
#[derive(Debug, Deserialize)]
struct MatrixError {
errcode: String,
error: String,
}
#[derive(Debug, Error)]
pub(crate) struct Error {
synapse_error: Option<MatrixError>,
#[source]
source: reqwest::Error,
}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(matrix_error) = &self.synapse_error {
write!(f, "{}: {}", matrix_error.errcode, matrix_error.error)
} else {
write!(f, "(no specific error)")
}
}
}
impl Error {
pub fn errcode(&self) -> Option<&str> {
let me = self.synapse_error.as_ref()?;
Some(&me.errcode)
}
}
#[async_trait]
pub(crate) trait SynapseResponseExt: Sized {
async fn error_for_synapse_error(self) -> Result<Self, Error>;
}
#[async_trait]
impl SynapseResponseExt for reqwest::Response {
async fn error_for_synapse_error(self) -> Result<Self, Error> {
match self.error_for_status_ref() {
Ok(_response) => Ok(self),
Err(source) => {
let synapse_error = self.json().await.ok();
Err(Error {
synapse_error,
source,
})
}
}
}
}