ab_io_type/metadata/
type_name.rs1use crate::metadata::IoTypeMetadataKind;
2
3macro_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#[inline(always)]
140const fn skip_n_bytes(input: &[u8], n: usize) -> Option<&[u8]> {
141 Some(forward_option!(input.split_at_checked(n)).1)
142}