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    ClassName(TypeName),          // ELEMENT_TYPE_CLASS
23    ValueName(TypeName),          // ELEMENT_TYPE_VALUETYPE
24    Array(Box<Self>),             // ELEMENT_TYPE_SZARRAY
25    Generic(String, u16),         // ELEMENT_TYPE_VAR
26    RefMut(Box<Self>),            // ELEMENT_TYPE_BYREF
27    RefConst(Box<Self>),          // ELEMENT_TYPE_CMOD_REQD (IsConst)
28    PtrMut(Box<Self>, usize),     // ELEMENT_TYPE_PTR
29    PtrConst(Box<Self>, usize),   // ELEMENT_TYPE_CMOD_REQD (IsConst), ELEMENT_TYPE_PTR
30    ArrayFixed(Box<Self>, usize), // ELEMENT_TYPE_ARRAY
31}
32
33impl Type {
34    pub fn class_named(namespace: &str, name: &str) -> Self {
35        Self::ClassName(TypeName::named(namespace, name))
36    }
37
38    pub fn value_named(namespace: &str, name: &str) -> Self {
39        Self::ValueName(TypeName::named(namespace, name))
40    }
41
42    pub fn code(&self) -> u8 {
43        match self {
44            Self::Bool => ELEMENT_TYPE_BOOLEAN,
45            Self::U8 => ELEMENT_TYPE_U1,
46            Self::I8 => ELEMENT_TYPE_I1,
47            Self::U16 => ELEMENT_TYPE_U2,
48            Self::I16 => ELEMENT_TYPE_I2,
49            Self::U32 => ELEMENT_TYPE_U4,
50            Self::I32 => ELEMENT_TYPE_I4,
51            Self::U64 => ELEMENT_TYPE_U8,
52            Self::I64 => ELEMENT_TYPE_I8,
53            Self::USize => ELEMENT_TYPE_U,
54            Self::ISize => ELEMENT_TYPE_I,
55            Self::F32 => ELEMENT_TYPE_R4,
56            Self::F64 => ELEMENT_TYPE_R8,
57            Self::String => ELEMENT_TYPE_STRING,
58            rest => panic!("{rest:?}"),
59        }
60    }
61}