use compact_str::CompactString;
use serde::{Deserialize, Serialize};
use super::{Extensions, PaymentRequirements, ResourceInfo, Version2};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[non_exhaustive]
pub struct PaymentRequired {
pub x402_version: Version2,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<CompactString>,
pub resource: ResourceInfo,
#[serde(default)]
pub accepts: Vec<PaymentRequirements>,
#[serde(default, skip_serializing_if = "Extensions::is_empty")]
pub extensions: Extensions,
}
impl PaymentRequired {
#[must_use]
pub fn new(resource: ResourceInfo) -> Self {
Self {
x402_version: super::V2,
error: None,
resource,
accepts: Vec::new(),
extensions: Extensions::new(),
}
}
#[must_use]
pub fn with_accepts(mut self, accepts: Vec<PaymentRequirements>) -> Self {
self.accepts = accepts;
self
}
#[must_use]
pub fn add_accept(mut self, accept: PaymentRequirements) -> Self {
self.accepts.push(accept);
self
}
#[must_use]
pub fn with_error(mut self, error: impl Into<CompactString>) -> Self {
self.error = Some(error.into());
self
}
#[must_use]
pub fn with_extensions(mut self, extensions: Extensions) -> Self {
self.extensions = extensions;
self
}
}