windows_metadata/
ty.rs

1use super::*;
2
3#[derive(Debug, PartialEq, Clone)]
4pub enum Type {
5    Void,
6    Bool,
7    Char,
8    I8,
9    U8,
10    I16,
11    U16,
12    I32,
13    U32,
14    I64,
15    U64,
16    F32,
17    F64,
18    ISize,
19    USize,
20    String,
21    Object,
22    AttributeEnum, // 0x55 is an unnamed ELEMENT_TYPE used by attributes to specify an enum
23    Name(TypeName),
24    Array(Box<Self>),    // ELEMENT_TYPE_SZARRAY
25    ArrayRef(Box<Self>), // ELEMENT_TYPE_BYREF, ELEMENT_TYPE_SZARRAY
26    ConstRef(Box<Self>), // ELEMENT_TYPE_CMOD_REQD (IsConst)
27    Generic(u16),        // ELEMENT_TYPE_VAR
28
29    PtrMut(Box<Self>, usize),     // ELEMENT_TYPE_PTR
30    PtrConst(Box<Self>, usize),   // ELEMENT_TYPE_CMOD_REQD (IsConst), ELEMENT_TYPE_PTR
31    ArrayFixed(Box<Self>, usize), // ELEMENT_TYPE_ARRAY
32}
33
34impl Type {
35    pub fn named(namespace: &str, name: &str) -> Self {
36        Self::Name(TypeName::named(namespace, name))
37    }
38
39    pub fn code(&self) -> u8 {
40        match self {
41            Self::Bool => ELEMENT_TYPE_BOOLEAN,
42            Self::U8 => ELEMENT_TYPE_U1,
43            Self::I8 => ELEMENT_TYPE_I1,
44            Self::U16 => ELEMENT_TYPE_U2,
45            Self::I16 => ELEMENT_TYPE_I2,
46            Self::U32 => ELEMENT_TYPE_U4,
47            Self::I32 => ELEMENT_TYPE_I4,
48            Self::U64 => ELEMENT_TYPE_U8,
49            Self::I64 => ELEMENT_TYPE_I8,
50            Self::F32 => ELEMENT_TYPE_R4,
51            Self::F64 => ELEMENT_TYPE_R8,
52            Self::String => ELEMENT_TYPE_STRING,
53            Self::AttributeEnum => 0x55,
54            rest => panic!("{rest:?}"),
55        }
56    }
57}