Skip to main content

windows_metadata/reader/tables/
constant.rs

1use super::*;
2
3impl<'a> Constant<'a> {
4    pub fn ty(&self) -> Type {
5        match self.usize(0).try_into().unwrap() {
6            ELEMENT_TYPE_U1 => Type::U8,
7            ELEMENT_TYPE_I1 => Type::I8,
8            ELEMENT_TYPE_U2 => Type::U16,
9            ELEMENT_TYPE_I2 => Type::I16,
10            ELEMENT_TYPE_U4 => Type::U32,
11            ELEMENT_TYPE_I4 => Type::I32,
12            ELEMENT_TYPE_U8 => Type::U64,
13            ELEMENT_TYPE_I8 => Type::I64,
14            ELEMENT_TYPE_U => Type::USize,
15            ELEMENT_TYPE_I => Type::ISize,
16            ELEMENT_TYPE_R4 => Type::F32,
17            ELEMENT_TYPE_R8 => Type::F64,
18            ELEMENT_TYPE_BOOLEAN => Type::Bool,
19            ELEMENT_TYPE_STRING => Type::String,
20            rest => panic!("{rest:?}"),
21        }
22    }
23
24    pub fn value(&self) -> Value {
25        let mut blob = self.blob(2);
26
27        match self.ty() {
28            Type::I8 => Value::I8(blob.read_i8()),
29            Type::U8 => Value::U8(blob.read_u8()),
30            Type::I16 => Value::I16(blob.read_i16()),
31            Type::U16 => Value::U16(blob.read_u16()),
32            Type::I32 => Value::I32(blob.read_i32()),
33            Type::U32 => Value::U32(blob.read_u32()),
34            Type::I64 => Value::I64(blob.read_i64()),
35            Type::U64 => Value::U64(blob.read_u64()),
36            Type::ISize => Value::ISize(blob.read_i64()),
37            Type::USize => Value::USize(blob.read_u64()),
38            Type::F32 => Value::F32(blob.read_f32()),
39            Type::F64 => Value::F64(blob.read_f64()),
40            Type::Bool => Value::Bool(blob.read_bool()),
41            Type::String => Value::Utf16(blob.read_utf16()),
42            rest => panic!("{rest:?}"),
43        }
44    }
45}