ab_io_type/metadata/
type_name.rs

1use crate::metadata::IoTypeMetadataKind;
2
3/// This macro is necessary to reduce boilerplate due to lack of `?` in const environment
4macro_rules! forward_option {
5    ($expr:expr) => {{
6        let Some(result) = $expr else {
7            return None;
8        };
9        result
10    }};
11}
12
13#[inline(always)]
14pub(super) const fn type_name(mut metadata: &[u8]) -> Option<&[u8]> {
15    if metadata.is_empty() {
16        return None;
17    }
18
19    let kind = forward_option!(IoTypeMetadataKind::try_from_u8(metadata[0]));
20    metadata = forward_option!(skip_n_bytes(metadata, 1));
21
22    Some(match kind {
23        IoTypeMetadataKind::Unit => b"()",
24        IoTypeMetadataKind::Bool => b"bool",
25        IoTypeMetadataKind::U8 => b"u8",
26        IoTypeMetadataKind::U16 => b"u16",
27        IoTypeMetadataKind::U32 => b"u32",
28        IoTypeMetadataKind::U64 => b"u64",
29        IoTypeMetadataKind::U128 => b"u128",
30        IoTypeMetadataKind::I8 => b"i8",
31        IoTypeMetadataKind::I16 => b"i16",
32        IoTypeMetadataKind::I32 => b"i32",
33        IoTypeMetadataKind::I64 => b"i64",
34        IoTypeMetadataKind::I128 => b"i128",
35        IoTypeMetadataKind::Struct
36        | IoTypeMetadataKind::Struct0
37        | IoTypeMetadataKind::Struct1
38        | IoTypeMetadataKind::Struct2
39        | IoTypeMetadataKind::Struct3
40        | IoTypeMetadataKind::Struct4
41        | IoTypeMetadataKind::Struct5
42        | IoTypeMetadataKind::Struct6
43        | IoTypeMetadataKind::Struct7
44        | IoTypeMetadataKind::Struct8
45        | IoTypeMetadataKind::Struct9
46        | IoTypeMetadataKind::Struct10
47        | IoTypeMetadataKind::TupleStruct
48        | IoTypeMetadataKind::TupleStruct1
49        | IoTypeMetadataKind::TupleStruct2
50        | IoTypeMetadataKind::TupleStruct3
51        | IoTypeMetadataKind::TupleStruct4
52        | IoTypeMetadataKind::TupleStruct5
53        | IoTypeMetadataKind::TupleStruct6
54        | IoTypeMetadataKind::TupleStruct7
55        | IoTypeMetadataKind::TupleStruct8
56        | IoTypeMetadataKind::TupleStruct9
57        | IoTypeMetadataKind::TupleStruct10
58        | IoTypeMetadataKind::Enum
59        | IoTypeMetadataKind::Enum1
60        | IoTypeMetadataKind::Enum2
61        | IoTypeMetadataKind::Enum3
62        | IoTypeMetadataKind::Enum4
63        | IoTypeMetadataKind::Enum5
64        | IoTypeMetadataKind::Enum6
65        | IoTypeMetadataKind::Enum7
66        | IoTypeMetadataKind::Enum8
67        | IoTypeMetadataKind::Enum9
68        | IoTypeMetadataKind::Enum10
69        | IoTypeMetadataKind::EnumNoFields
70        | IoTypeMetadataKind::EnumNoFields1
71        | IoTypeMetadataKind::EnumNoFields2
72        | IoTypeMetadataKind::EnumNoFields3
73        | IoTypeMetadataKind::EnumNoFields4
74        | IoTypeMetadataKind::EnumNoFields5
75        | IoTypeMetadataKind::EnumNoFields6
76        | IoTypeMetadataKind::EnumNoFields7
77        | IoTypeMetadataKind::EnumNoFields8
78        | IoTypeMetadataKind::EnumNoFields9
79        | IoTypeMetadataKind::EnumNoFields10 => {
80            if metadata.is_empty() {
81                return None;
82            }
83
84            let type_name_length = metadata[0] as usize;
85            metadata = forward_option!(skip_n_bytes(metadata, 1));
86
87            if metadata.len() < type_name_length {
88                return None;
89            }
90
91            let (type_name, _) = metadata.split_at(type_name_length);
92            type_name
93        }
94        IoTypeMetadataKind::Array8b
95        | IoTypeMetadataKind::Array16b
96        | IoTypeMetadataKind::Array32b => b"[T; N]",
97        IoTypeMetadataKind::ArrayU8x8 => b"[u8; 8]",
98        IoTypeMetadataKind::ArrayU8x16 => b"[u8; 16]",
99        IoTypeMetadataKind::ArrayU8x32 => b"[u8; 32]",
100        IoTypeMetadataKind::ArrayU8x64 => b"[u8; 64]",
101        IoTypeMetadataKind::ArrayU8x128 => b"[u8; 128]",
102        IoTypeMetadataKind::ArrayU8x256 => b"[u8; 256]",
103        IoTypeMetadataKind::ArrayU8x512 => b"[u8; 512]",
104        IoTypeMetadataKind::ArrayU8x1024 => b"[u8; 1024]",
105        IoTypeMetadataKind::ArrayU8x2028 => b"[u8; 2028]",
106        IoTypeMetadataKind::ArrayU8x4096 => b"[u8; 4096]",
107        IoTypeMetadataKind::VariableBytes8b
108        | IoTypeMetadataKind::VariableBytes16b
109        | IoTypeMetadataKind::VariableBytes32b
110        | IoTypeMetadataKind::VariableBytes0
111        | IoTypeMetadataKind::VariableBytes512
112        | IoTypeMetadataKind::VariableBytes1024
113        | IoTypeMetadataKind::VariableBytes2028
114        | IoTypeMetadataKind::VariableBytes4096
115        | IoTypeMetadataKind::VariableBytes8192
116        | IoTypeMetadataKind::VariableBytes16384
117        | IoTypeMetadataKind::VariableBytes32768
118        | IoTypeMetadataKind::VariableBytes65536
119        | IoTypeMetadataKind::VariableBytes131072
120        | IoTypeMetadataKind::VariableBytes262144
121        | IoTypeMetadataKind::VariableBytes524288
122        | IoTypeMetadataKind::VariableBytes1048576 => b"VariableBytes",
123        IoTypeMetadataKind::VariableElements8b
124        | IoTypeMetadataKind::VariableElements16b
125        | IoTypeMetadataKind::VariableElements32b
126        | IoTypeMetadataKind::VariableElements0 => b"VariableElements",
127        IoTypeMetadataKind::FixedCapacityBytes8b | IoTypeMetadataKind::FixedCapacityBytes16b => {
128            b"FixedCapacityBytes"
129        }
130        IoTypeMetadataKind::FixedCapacityString8b | IoTypeMetadataKind::FixedCapacityString16b => {
131            b"FixedCapacityString"
132        }
133        IoTypeMetadataKind::Address => b"Address",
134        IoTypeMetadataKind::Balance => b"Balance",
135    })
136}
137
138/// Skips `n` bytes and return remainder
139#[inline(always)]
140const fn skip_n_bytes(input: &[u8], n: usize) -> Option<&[u8]> {
141    Some(forward_option!(input.split_at_checked(n)).1)
142}