dpp/tokens/token_payment_info/
mod.rs1use crate::balances::credits::TokenAmount;
46use crate::data_contract::TokenContractPosition;
47use crate::tokens::gas_fees_paid_by::GasFeesPaidBy;
48use crate::tokens::token_payment_info::methods::v0::TokenPaymentInfoMethodsV0;
49use crate::tokens::token_payment_info::v0::v0_accessors::TokenPaymentInfoAccessorsV0;
50use crate::tokens::token_payment_info::v0::TokenPaymentInfoV0;
51use crate::ProtocolError;
52use bincode::{Decode, Encode};
53use derive_more::{Display, From};
54use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
55use platform_value::btreemap_extensions::BTreeValueMapHelper;
56#[cfg(feature = "value-conversion")]
57use platform_value::Error;
58use platform_value::{Identifier, Value};
59#[cfg(any(
60 feature = "serde-conversion",
61 all(feature = "serde-conversion", feature = "serde-conversion"),
62))]
63use serde::{Deserialize, Serialize};
64use std::collections::BTreeMap;
65
66pub mod methods;
67pub mod v0;
68
69#[derive(
70 Debug,
71 Clone,
72 Copy,
73 Encode,
74 Decode,
75 PlatformDeserialize,
76 PlatformSerialize,
77 PartialEq,
78 Display,
79 From,
80)]
81#[cfg_attr(
82 any(
83 feature = "serde-conversion",
84 all(feature = "serde-conversion", feature = "serde-conversion"),
85 ),
86 derive(Serialize, Deserialize),
87 serde(tag = "$formatVersion")
88)]
89pub enum TokenPaymentInfo {
99 #[display("V0({})", "_0")]
100 #[cfg_attr(
101 any(
102 feature = "serde-conversion",
103 all(feature = "serde-conversion", feature = "serde-conversion"),
104 ),
105 serde(rename = "0")
106 )]
107 V0(TokenPaymentInfoV0),
108}
109
110impl TokenPaymentInfoMethodsV0 for TokenPaymentInfo {}
111
112impl TokenPaymentInfoAccessorsV0 for TokenPaymentInfo {
113 fn payment_token_contract_id(&self) -> Option<Identifier> {
115 match self {
116 TokenPaymentInfo::V0(v0) => v0.payment_token_contract_id(),
117 }
118 }
119
120 fn payment_token_contract_id_ref(&self) -> &Option<Identifier> {
121 match self {
122 TokenPaymentInfo::V0(v0) => v0.payment_token_contract_id_ref(),
123 }
124 }
125
126 fn token_contract_position(&self) -> TokenContractPosition {
127 match self {
128 TokenPaymentInfo::V0(v0) => v0.token_contract_position(),
129 }
130 }
131
132 fn minimum_token_cost(&self) -> Option<TokenAmount> {
133 match self {
134 TokenPaymentInfo::V0(v0) => v0.minimum_token_cost(),
135 }
136 }
137
138 fn maximum_token_cost(&self) -> Option<TokenAmount> {
139 match self {
140 TokenPaymentInfo::V0(v0) => v0.maximum_token_cost(),
141 }
142 }
143
144 fn gas_fees_paid_by(&self) -> GasFeesPaidBy {
145 match self {
146 TokenPaymentInfo::V0(v0) => v0.gas_fees_paid_by(),
147 }
148 }
149
150 fn set_payment_token_contract_id(&mut self, id: Option<Identifier>) {
152 match self {
153 TokenPaymentInfo::V0(v0) => v0.set_payment_token_contract_id(id),
154 }
155 }
156
157 fn set_token_contract_position(&mut self, position: TokenContractPosition) {
158 match self {
159 TokenPaymentInfo::V0(v0) => v0.set_token_contract_position(position),
160 }
161 }
162
163 fn set_minimum_token_cost(&mut self, cost: Option<TokenAmount>) {
164 match self {
165 TokenPaymentInfo::V0(v0) => v0.set_minimum_token_cost(cost),
166 }
167 }
168
169 fn set_maximum_token_cost(&mut self, cost: Option<TokenAmount>) {
170 match self {
171 TokenPaymentInfo::V0(v0) => v0.set_maximum_token_cost(cost),
172 }
173 }
174
175 fn set_gas_fees_paid_by(&mut self, payer: GasFeesPaidBy) {
176 match self {
177 TokenPaymentInfo::V0(v0) => v0.set_gas_fees_paid_by(payer),
178 }
179 }
180}
181
182impl TryFrom<BTreeMap<String, Value>> for TokenPaymentInfo {
183 type Error = ProtocolError;
184
185 fn try_from(map: BTreeMap<String, Value>) -> Result<Self, Self::Error> {
186 let format_version = map.get_str("$formatVersion")?;
190 match format_version {
191 "0" => {
192 let token_payment_info: TokenPaymentInfoV0 = map.try_into()?;
193
194 Ok(token_payment_info.into())
195 }
196 version => Err(ProtocolError::UnknownVersionMismatch {
197 method: "TokenPaymentInfo::from_value".to_string(),
198 known_versions: vec![0],
199 received: version
200 .parse()
201 .map_err(|_| ProtocolError::Generic("Conversion error".to_string()))?,
202 }),
203 }
204 }
205}
206
207#[cfg(feature = "value-conversion")]
208impl TryFrom<TokenPaymentInfo> for Value {
209 type Error = Error;
210 fn try_from(value: TokenPaymentInfo) -> Result<Self, Self::Error> {
215 platform_value::to_value(value)
216 }
217}