radix_transactions/manifest/
manifest_naming.rs

1use 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    // This ensures that we can add new types here without
137    // breaking backwards compatibility of encoded existing manifests
138    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}