r402_core/wire/
payment_required.rs1use compact_str::CompactString;
4use serde::{Deserialize, Serialize};
5
6use super::{Extensions, PaymentRequirements, ResourceInfo, Version2};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
18#[serde(rename_all = "camelCase", deny_unknown_fields)]
19#[non_exhaustive]
20pub struct PaymentRequired {
21 pub x402_version: Version2,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub error: Option<CompactString>,
26 pub resource: ResourceInfo,
28 #[serde(default)]
30 pub accepts: Vec<PaymentRequirements>,
31 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
33 pub extensions: Extensions,
34}
35
36impl PaymentRequired {
37 #[must_use]
42 pub fn new(resource: ResourceInfo) -> Self {
43 Self {
44 x402_version: super::V2,
45 error: None,
46 resource,
47 accepts: Vec::new(),
48 extensions: Extensions::new(),
49 }
50 }
51
52 #[must_use]
54 pub fn with_accepts(mut self, accepts: Vec<PaymentRequirements>) -> Self {
55 self.accepts = accepts;
56 self
57 }
58
59 #[must_use]
61 pub fn add_accept(mut self, accept: PaymentRequirements) -> Self {
62 self.accepts.push(accept);
63 self
64 }
65
66 #[must_use]
69 pub fn with_error(mut self, error: impl Into<CompactString>) -> Self {
70 self.error = Some(error.into());
71 self
72 }
73
74 #[must_use]
76 pub fn with_extensions(mut self, extensions: Extensions) -> Self {
77 self.extensions = extensions;
78 self
79 }
80}