radix_common/data/scrypto/
custom_extension.rs

1use crate::internal_prelude::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Copy)]
4pub struct ScryptoCustomExtension {}
5
6impl CustomExtension for ScryptoCustomExtension {
7    const PAYLOAD_PREFIX: u8 = SCRYPTO_SBOR_V1_PAYLOAD_PREFIX;
8
9    type CustomValueKind = ScryptoCustomValueKind;
10    type CustomTraversal = ScryptoCustomTraversal;
11    type CustomSchema = ScryptoCustomSchema;
12
13    fn custom_value_kind_matches_type_kind(
14        _: &Schema<Self::CustomSchema>,
15        custom_value_kind: Self::CustomValueKind,
16        type_kind: &LocalTypeKind<Self::CustomSchema>,
17    ) -> bool {
18        match custom_value_kind {
19            ScryptoCustomValueKind::Reference => matches!(
20                type_kind,
21                TypeKind::Custom(ScryptoCustomTypeKind::Reference)
22            ),
23            ScryptoCustomValueKind::Own => {
24                matches!(type_kind, TypeKind::Custom(ScryptoCustomTypeKind::Own))
25            }
26            ScryptoCustomValueKind::Decimal => {
27                matches!(type_kind, TypeKind::Custom(ScryptoCustomTypeKind::Decimal))
28            }
29            ScryptoCustomValueKind::PreciseDecimal => matches!(
30                type_kind,
31                TypeKind::Custom(ScryptoCustomTypeKind::PreciseDecimal)
32            ),
33            ScryptoCustomValueKind::NonFungibleLocalId => matches!(
34                type_kind,
35                TypeKind::Custom(ScryptoCustomTypeKind::NonFungibleLocalId)
36            ),
37        }
38    }
39
40    fn custom_type_kind_matches_non_custom_value_kind(
41        _: &Schema<Self::CustomSchema>,
42        _: &<Self::CustomSchema as CustomSchema>::CustomLocalTypeKind,
43        _: ValueKind<Self::CustomValueKind>,
44    ) -> bool {
45        // It's not possible for a custom type kind to match a non-custom value kind
46        false
47    }
48}