use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[cfg_attr(debug_assertions, derive(Debug))]
#[derive(Clone, Serialize, Deserialize)]
pub struct SimpleError {
pub error: Option<String>,
pub error_description: Option<String>,
pub message: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
impl SimpleError {
pub fn error_message(&self) -> String {
[&self.error, &self.error_description, &self.message]
.iter()
.filter_map(|v| (*v).clone())
.collect::<Vec<String>>()
.join(": ")
}
}
#[derive(Debug, Error)]
pub enum ClientError {
#[error("error-atproto-client-http-1 HTTP request failed: {url} {error}")]
HttpRequestFailed {
url: String,
error: reqwest::Error,
},
#[error("error-atproto-client-http-2 JSON parsing failed: {url} {error}")]
JsonParseFailed {
url: String,
error: reqwest::Error,
},
#[error("error-atproto-client-http-3 Failed to stream response bytes: {url} {error}")]
ByteStreamFailed {
url: String,
error: reqwest::Error,
},
}
#[derive(Debug, Error)]
pub enum DPoPError {
#[error("error-atproto-client-auth-1 DPoP proof generation failed: {error}")]
ProofGenerationFailed {
error: anyhow::Error,
},
#[error("error-atproto-client-auth-2 DPoP HTTP request failed: {url} {error}")]
HttpRequestFailed {
url: String,
error: reqwest_middleware::Error,
},
#[error("error-atproto-client-auth-3 DPoP JSON parsing failed: {url} {error}")]
JsonParseFailed {
url: String,
error: reqwest::Error,
},
}
#[derive(Debug, Error)]
pub enum CliError {
#[error("error-atproto-client-cli-1 Failed to read file: {path}")]
FileReadFailed {
path: String,
},
#[error("error-atproto-client-cli-2 Failed to parse JSON from file: {path}")]
JsonParseFromFileFailed {
path: String,
},
#[error("error-atproto-client-cli-3 No PDS endpoint found in DID document for: {did}")]
NoPdsEndpointFound {
did: String,
},
#[error("error-atproto-client-cli-4 No JSON data provided for procedure call")]
NoJsonDataProvided,
}