radix_transactions/manifest/
manifest_naming.rs1use crate::internal_prelude::*;
2
3#[derive(Default, Clone, Debug, ManifestSbor, ScryptoDescribe, PartialEq, Eq)]
4pub struct TransactionObjectNames {
5 pub root_intent: ManifestObjectNames,
6 pub subintents: Vec<ManifestObjectNames>,
7}
8
9impl TransactionObjectNames {
10 pub fn unknown_with_subintent_count(subintents: usize) -> Self {
11 Self {
12 root_intent: ManifestObjectNames::Unknown,
13 subintents: (0..subintents)
14 .map(|_| ManifestObjectNames::Unknown)
15 .collect(),
16 }
17 }
18}
19
20#[derive(Default, Clone, Debug, ManifestSbor, ScryptoDescribe, PartialEq, Eq)]
21pub enum ManifestObjectNames {
22 #[default]
23 Unknown,
24 Known(KnownManifestObjectNames),
25}
26
27impl From<KnownManifestObjectNames> for ManifestObjectNames {
28 fn from(value: KnownManifestObjectNames) -> Self {
29 Self::Known(value)
30 }
31}
32
33#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]
34pub enum ManifestObjectNamesRef<'a> {
35 #[default]
36 Unknown,
37 Known(&'a KnownManifestObjectNames),
38}
39
40impl<'a> HasManifestObjectNames<'a, 'a> for ManifestObjectNames {
41 fn as_ref(&'a self) -> ManifestObjectNamesRef<'a> {
42 match self {
43 ManifestObjectNames::Unknown => ManifestObjectNamesRef::Unknown,
44 ManifestObjectNames::Known(known) => ManifestObjectNamesRef::Known(known),
45 }
46 }
47}
48
49impl<'s, 'a> HasManifestObjectNames<'s, 'a> for ManifestObjectNamesRef<'a> {
50 fn as_ref(&'s self) -> ManifestObjectNamesRef<'a> {
51 *self
52 }
53}
54
55pub trait HasManifestObjectNames<'s, 'r> {
56 fn as_ref(&'s self) -> ManifestObjectNamesRef<'r>;
57
58 fn known_bucket_name(&'s self, bucket: ManifestBucket) -> Option<&'r str> {
59 match self.as_ref() {
60 ManifestObjectNamesRef::Unknown => None,
61 ManifestObjectNamesRef::Known(known) => known.known_bucket_name(bucket),
62 }
63 }
64
65 fn bucket_name(&'s self, bucket: ManifestBucket) -> String {
66 match self.known_bucket_name(bucket) {
67 Some(name) => name.to_owned(),
68 None => format!("bucket{}", bucket.0 + 1),
69 }
70 }
71
72 fn known_proof_name(&'s self, proof: ManifestProof) -> Option<&'r str> {
73 match self.as_ref() {
74 ManifestObjectNamesRef::Unknown => None,
75 ManifestObjectNamesRef::Known(known) => known.known_proof_name(proof),
76 }
77 }
78
79 fn proof_name(&'s self, proof: ManifestProof) -> String {
80 match self.known_proof_name(proof) {
81 Some(name) => name.to_owned(),
82 None => format!("proof{}", proof.0 + 1),
83 }
84 }
85
86 fn known_address_reservation_name(
87 &'s self,
88 reservation: ManifestAddressReservation,
89 ) -> Option<&'r str> {
90 match self.as_ref() {
91 ManifestObjectNamesRef::Unknown => None,
92 ManifestObjectNamesRef::Known(known) => {
93 known.known_address_reservation_name(reservation)
94 }
95 }
96 }
97
98 fn address_reservation_name(&'s self, reservation: ManifestAddressReservation) -> String {
99 match self.known_address_reservation_name(reservation) {
100 Some(name) => name.to_owned(),
101 None => format!("reservation{}", reservation.0 + 1),
102 }
103 }
104
105 fn known_address_name(&'s self, named_address: ManifestNamedAddress) -> Option<&'r str> {
106 match self.as_ref() {
107 ManifestObjectNamesRef::Unknown => None,
108 ManifestObjectNamesRef::Known(known) => known.known_address_name(named_address),
109 }
110 }
111
112 fn address_name(&'s self, named_address: ManifestNamedAddress) -> String {
113 match self.known_address_name(named_address) {
114 Some(name) => name.to_owned(),
115 None => format!("address{}", named_address.0 + 1),
116 }
117 }
118
119 fn known_intent_name(&'s self, intent: ManifestNamedIntent) -> Option<&'r str> {
120 match self.as_ref() {
121 ManifestObjectNamesRef::Unknown => None,
122 ManifestObjectNamesRef::Known(known) => known.known_intent_name(intent),
123 }
124 }
125
126 fn intent_name(&'s self, intent: ManifestNamedIntent) -> String {
127 match self.known_intent_name(intent) {
128 Some(name) => name.to_owned(),
129 None => format!("intent{}", intent.0 + 1),
130 }
131 }
132}
133
134#[derive(Default, Clone, Debug, ManifestSbor, ScryptoDescribe, PartialEq, Eq)]
135#[sbor(
136 as_type = "SborBackwardsCompatibleKnownManifestObjectNames",
139 as_ref = "&self.into()"
140)]
141pub struct KnownManifestObjectNames {
142 pub bucket_names: IndexMap<ManifestBucket, String>,
143 pub proof_names: IndexMap<ManifestProof, String>,
144 pub address_reservation_names: IndexMap<ManifestAddressReservation, String>,
145 pub address_names: IndexMap<ManifestNamedAddress, String>,
146 pub intent_names: IndexMap<ManifestNamedIntent, String>,
147}
148
149impl<'s> HasManifestObjectNames<'s, 's> for KnownManifestObjectNames {
150 fn as_ref(&'s self) -> ManifestObjectNamesRef<'s> {
151 ManifestObjectNamesRef::Known(self)
152 }
153
154 fn known_bucket_name(&self, bucket: ManifestBucket) -> Option<&str> {
155 self.bucket_names.get(&bucket).map(|n| n.as_str())
156 }
157
158 fn known_proof_name(&self, proof: ManifestProof) -> Option<&str> {
159 self.proof_names.get(&proof).map(|n| n.as_str())
160 }
161
162 fn known_address_reservation_name(
163 &self,
164 reservation: ManifestAddressReservation,
165 ) -> Option<&str> {
166 self.address_reservation_names
167 .get(&reservation)
168 .map(|n| n.as_str())
169 }
170
171 fn known_address_name(&self, named_address: ManifestNamedAddress) -> Option<&str> {
172 self.address_names.get(&named_address).map(|n| n.as_str())
173 }
174
175 fn known_intent_name(&self, intent: ManifestNamedIntent) -> Option<&str> {
176 self.intent_names.get(&intent).map(|n| n.as_str())
177 }
178}
179
180#[derive(ManifestSbor, ScryptoDescribe)]
181#[sbor(transparent)]
182struct SborBackwardsCompatibleKnownManifestObjectNames {
183 names: BTreeMap<String, IndexMap<u32, String>>,
184}
185
186impl<'a> From<&'a KnownManifestObjectNames> for SborBackwardsCompatibleKnownManifestObjectNames {
187 fn from(value: &'a KnownManifestObjectNames) -> Self {
188 let mut names = BTreeMap::<String, IndexMap<u32, String>>::new();
189 names.insert(
190 "buckets".to_string(),
191 value
192 .bucket_names
193 .iter()
194 .map(|(b, name)| (b.0, name.to_string()))
195 .collect(),
196 );
197 names.insert(
198 "proofs".to_string(),
199 value
200 .proof_names
201 .iter()
202 .map(|(b, name)| (b.0, name.to_string()))
203 .collect(),
204 );
205 names.insert(
206 "reservations".to_string(),
207 value
208 .address_reservation_names
209 .iter()
210 .map(|(b, name)| (b.0, name.to_string()))
211 .collect(),
212 );
213 names.insert(
214 "addresses".to_string(),
215 value
216 .address_names
217 .iter()
218 .map(|(b, name)| (b.0, name.to_string()))
219 .collect(),
220 );
221 names.insert(
222 "intents".to_string(),
223 value
224 .intent_names
225 .iter()
226 .map(|(b, name)| (b.0, name.to_string()))
227 .collect(),
228 );
229 Self { names }
230 }
231}
232
233impl From<SborBackwardsCompatibleKnownManifestObjectNames> for KnownManifestObjectNames {
234 fn from(mut value: SborBackwardsCompatibleKnownManifestObjectNames) -> Self {
235 Self {
236 bucket_names: value
237 .names
238 .remove("buckets")
239 .map(|names| {
240 names
241 .into_iter()
242 .map(|(key, name)| (ManifestBucket(key), name))
243 .collect()
244 })
245 .unwrap_or_default(),
246 proof_names: value
247 .names
248 .remove("proofs")
249 .map(|names| {
250 names
251 .into_iter()
252 .map(|(key, name)| (ManifestProof(key), name))
253 .collect()
254 })
255 .unwrap_or_default(),
256 address_reservation_names: value
257 .names
258 .remove("reservations")
259 .map(|names| {
260 names
261 .into_iter()
262 .map(|(key, name)| (ManifestAddressReservation(key), name))
263 .collect()
264 })
265 .unwrap_or_default(),
266 address_names: value
267 .names
268 .remove("addresses")
269 .map(|names| {
270 names
271 .into_iter()
272 .map(|(key, name)| (ManifestNamedAddress(key), name))
273 .collect()
274 })
275 .unwrap_or_default(),
276 intent_names: value
277 .names
278 .remove("intents")
279 .map(|names| {
280 names
281 .into_iter()
282 .map(|(key, name)| (ManifestNamedIntent(key), name))
283 .collect()
284 })
285 .unwrap_or_default(),
286 }
287 }
288}