use r402_core::wire::PaymentRequired;
use crate::constants::MCP_PAYMENT_REQUIRED_CODE;
#[derive(Debug, Clone)]
pub struct PaymentRequiredError {
pub code: i32,
pub message: String,
pub payment_required: PaymentRequired,
}
impl PaymentRequiredError {
#[must_use]
pub fn new(message: impl Into<String>, payment_required: PaymentRequired) -> Self {
Self {
code: MCP_PAYMENT_REQUIRED_CODE,
message: message.into(),
payment_required,
}
}
}
impl std::fmt::Display for PaymentRequiredError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for PaymentRequiredError {}
#[derive(Debug, thiserror::Error)]
pub enum McpClientError {
#[error("mcp transport: {0}")]
Transport(String),
#[error("payment creation: {0}")]
Payment(String),
#[error("payment still required after retry")]
StillRequired,
#[error(transparent)]
PaymentRequired(#[from] Box<PaymentRequiredError>),
}
impl From<PaymentRequiredError> for McpClientError {
fn from(value: PaymentRequiredError) -> Self {
Self::PaymentRequired(Box::new(value))
}
}