use std::fmt;
use qubit_budget::BudgetError;
use qubit_budget::MeasuredBudgetError;
use qubit_budget::QuantityConversionError;
use qubit_budget::json::JsonResource;
use qubit_json::decode::JsonSyntaxError;
use qubit_json::encode::JsonEncodeError;
use qubit_json::encode::JsonEncodeErrorSource;
use qubit_json::encode::JsonSerializationError;
#[derive(Debug)]
#[non_exhaustive]
#[must_use]
pub enum MetadataWireEncodeError {
Budget(BudgetError<JsonResource, usize>),
Quantity {
resource: JsonResource,
source: QuantityConversionError,
},
Syntax(JsonSyntaxError),
Json(JsonSerializationError),
Io(std::io::Error),
}
impl fmt::Display for MetadataWireEncodeError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Budget(error) => {
write!(formatter, "JSON resource budget exceeded: {error}")
}
Self::Quantity { resource, source } => write!(
formatter,
"JSON resource quantity conversion failed for {resource:?}: {source}",
),
Self::Syntax(error) => {
write!(formatter, "invalid JSON wire syntax: {error}")
}
Self::Json(error) => {
write!(formatter, "failed to encode JSON wire value: {error}")
}
Self::Io(error) => {
write!(formatter, "failed to write JSON wire value: {error}")
}
}
}
}
impl std::error::Error for MetadataWireEncodeError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Budget(error) => Some(error),
Self::Quantity { source, .. } => Some(source),
Self::Syntax(error) => Some(error),
Self::Json(error) => Some(error),
Self::Io(error) => Some(error),
}
}
}
impl From<JsonEncodeError<JsonResource>> for MetadataWireEncodeError {
fn from(error: JsonEncodeError<JsonResource>) -> Self {
match error.into_source() {
JsonEncodeErrorSource::Budget(source) => match source {
MeasuredBudgetError::Budget(error) => Self::Budget(error),
MeasuredBudgetError::Quantity { resource, source } => Self::Quantity { resource, source },
},
JsonEncodeErrorSource::InvalidRawJson(source) => Self::Syntax(source),
JsonEncodeErrorSource::Serialize(source) => Self::Json(source),
JsonEncodeErrorSource::Write(source) => Self::Io(source),
}
}
}
impl From<MeasuredBudgetError<JsonResource, usize>> for MetadataWireEncodeError {
fn from(error: MeasuredBudgetError<JsonResource, usize>) -> Self {
match error {
MeasuredBudgetError::Budget(error) => Self::Budget(error),
MeasuredBudgetError::Quantity { resource, source } => Self::Quantity { resource, source },
}
}
}