r402_protocol/payment/
payload.rs1use serde::{Deserialize, Serialize};
4
5use super::{Extensions, ResourceInfo, V2, Version2};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase", deny_unknown_fields)]
10#[non_exhaustive]
11pub struct PaymentPayload<TAccepted, TPayload> {
12 pub accepted: TAccepted,
14 pub payload: TPayload,
16 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub resource: Option<ResourceInfo>,
19 pub x402_version: Version2,
21 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
23 pub extensions: Extensions,
24}
25
26impl<TAccepted, TPayload> PaymentPayload<TAccepted, TPayload> {
27 #[must_use]
29 pub fn new(accepted: TAccepted, payload: TPayload) -> Self {
30 Self {
31 accepted,
32 payload,
33 resource: None,
34 x402_version: V2,
35 extensions: Extensions::new(),
36 }
37 }
38
39 #[must_use]
41 pub fn with_resource(mut self, resource: ResourceInfo) -> Self {
42 self.resource = Some(resource);
43 self
44 }
45
46 #[must_use]
48 pub fn with_optional_resource(mut self, resource: Option<ResourceInfo>) -> Self {
49 self.resource = resource;
50 self
51 }
52
53 #[must_use]
55 pub fn with_extensions(mut self, extensions: Extensions) -> Self {
56 self.extensions = extensions;
57 self
58 }
59}