Documentation
use super::*;
use crate::traits::Decode;

#[derive(Debug)]
pub enum ElementType {
    Void,
    Bool,
    Char,
    I8,
    U8,
    I16,
    U16,
    I32,
    U32,
    I64,
    U64,
    F32,
    F64,
    ISize,
    USize,
    String,
    Struct(TypeDefOrRef),
    Class(TypeDefOrRef),
}

impl ElementType {
    pub fn from_blob(blob: &mut Blob) -> ElementType {
        let code = blob.read_unsigned();
        match code {
            0x01 => ElementType::Void,
            0x02 => ElementType::Bool,
            0x03 => ElementType::Char,
            0x04 => ElementType::I8,
            0x05 => ElementType::U8,
            0x06 => ElementType::I16,
            0x07 => ElementType::U16,
            0x08 => ElementType::I32,
            0x09 => ElementType::U32,
            0x0a => ElementType::I64,
            0x0b => ElementType::U64,
            0x0c => ElementType::F32,
            0x0d => ElementType::F64,
            0x18 => ElementType::ISize,
            0x19 => ElementType::USize,
            0x0e => ElementType::String,
            0x11 => {
                ElementType::Struct(TypeDefOrRef::decode(blob.read_unsigned(), blob.file_index))
            }
            0x12 => ElementType::Class(TypeDefOrRef::decode(blob.read_unsigned(), blob.file_index)),

            unknown_type => panic!(format!("Unexpected ElementType: {:x}", unknown_type)),
        }
    }

    pub fn from_code(code: u32) -> ElementType {
        match code {
            0x01 => ElementType::Void,
            0x02 => ElementType::Bool,
            0x03 => ElementType::Char,
            0x04 => ElementType::I8,
            0x05 => ElementType::U8,
            0x06 => ElementType::I16,
            0x07 => ElementType::U16,
            0x08 => ElementType::I32,
            0x09 => ElementType::U32,
            0x0a => ElementType::I64,
            0x0b => ElementType::U64,
            0x0c => ElementType::F32,
            0x0d => ElementType::F64,
            0x18 => ElementType::ISize,
            0x19 => ElementType::USize,
            0x0e => ElementType::String,
            unknown_code => panic!(format!("Unexpected ElementType: {:x}", unknown_code)),
        }
    }
}