windows_metadata/reader/tables/
constant.rs

1use super::*;
2
3impl Constant<'_> {
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_R4 => Type::F32,
15            ELEMENT_TYPE_R8 => Type::F64,
16            ELEMENT_TYPE_STRING => Type::String,
17            rest => panic!("{rest:?}"),
18        }
19    }
20
21    pub fn parent(&self) -> HasConstant {
22        self.decode(1)
23    }
24
25    pub fn value(&self) -> Value {
26        let mut blob = self.blob(2);
27
28        match self.ty() {
29            Type::I8 => Value::I8(blob.read_i8()),
30            Type::U8 => Value::U8(blob.read_u8()),
31            Type::I16 => Value::I16(blob.read_i16()),
32            Type::U16 => Value::U16(blob.read_u16()),
33            Type::I32 => Value::I32(blob.read_i32()),
34            Type::U32 => Value::U32(blob.read_u32()),
35            Type::I64 => Value::I64(blob.read_i64()),
36            Type::U64 => Value::U64(blob.read_u64()),
37            Type::F32 => Value::F32(blob.read_f32()),
38            Type::F64 => Value::F64(blob.read_f64()),
39            Type::String => Value::Utf16(blob.read_utf16()),
40            rest => panic!("{rest:?}"),
41        }
42    }
43}