windows_gen 0.14.1

Code generation for the windows crate
use super::*;

#[derive(Clone)]
pub struct Constant(pub Row);

impl Constant {
    pub fn value_type(&self) -> ElementType {
        let code = self.0.u32(0);
        ElementType::from_code(code).unwrap_or_else(|| panic!("Unexpected ElementType: {:x}", code))
    }

    pub fn value_blob(&self) -> Blob {
        self.0.blob(2)
    }

    pub fn value(&self) -> ConstantValue {
        let mut value = self.value_blob();

        match self.value_type() {
            ElementType::I8 => ConstantValue::I8(value.read_i8()),
            ElementType::U8 => ConstantValue::U8(value.read_u8()),
            ElementType::I16 => ConstantValue::I16(value.read_i16()),
            ElementType::U16 => ConstantValue::U16(value.read_u16()),
            ElementType::I32 => ConstantValue::I32(value.read_i32()),
            ElementType::U32 => ConstantValue::U32(value.read_u32()),
            ElementType::I64 => ConstantValue::I64(value.read_i64()),
            ElementType::U64 => ConstantValue::U64(value.read_u64()),
            ElementType::F32 => ConstantValue::F32(value.read_f32()),
            ElementType::F64 => ConstantValue::F64(value.read_f64()),
            ElementType::String => ConstantValue::String(value.read_utf16()),
            _ => unexpected!(),
        }
    }
}

impl std::fmt::Debug for Constant {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("Constant")
            .field("value", &self.value())
            .finish()
    }
}