Skip to main content

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    Generic(u16),        // ELEMENT_TYPE_VAR
27    RefMut(Box<Self>),   // ELEMENT_TYPE_BYREF
28    RefConst(Box<Self>), // ELEMENT_TYPE_CMOD_REQD (IsConst)
29
30    PtrMut(Box<Self>, usize),     // ELEMENT_TYPE_PTR
31    PtrConst(Box<Self>, usize),   // ELEMENT_TYPE_CMOD_REQD (IsConst), ELEMENT_TYPE_PTR
32    ArrayFixed(Box<Self>, usize), // ELEMENT_TYPE_ARRAY
33}
34
35impl Type {
36    pub fn named(namespace: &str, name: &str) -> Self {
37        Self::Name(TypeName::named(namespace, name))
38    }
39
40    pub fn code(&self) -> u8 {
41        match self {
42            Self::Bool => ELEMENT_TYPE_BOOLEAN,
43            Self::U8 => ELEMENT_TYPE_U1,
44            Self::I8 => ELEMENT_TYPE_I1,
45            Self::U16 => ELEMENT_TYPE_U2,
46            Self::I16 => ELEMENT_TYPE_I2,
47            Self::U32 => ELEMENT_TYPE_U4,
48            Self::I32 => ELEMENT_TYPE_I4,
49            Self::U64 => ELEMENT_TYPE_U8,
50            Self::I64 => ELEMENT_TYPE_I8,
51            Self::F32 => ELEMENT_TYPE_R4,
52            Self::F64 => ELEMENT_TYPE_R8,
53            Self::String => ELEMENT_TYPE_STRING,
54            Self::AttributeEnum => 0x55,
55            rest => panic!("{rest:?}"),
56        }
57    }
58}
59
60impl From<(&str, &str)> for Type {
61    fn from(value: (&str, &str)) -> Self {
62        Self::named(value.0, value.1)
63    }
64}