use crate::idltypes::{decimal::Decimal, safearray::SafeArray, vartype::VarType};
use winapi::ctypes::c_void;
use winapi::shared::wtypes::BSTR;
use winapi::um::oaidl::IDispatch;
use winapi::um::unknwnbase::IUnknown;
#[repr(C)]
#[derive(Copy, Clone)]
pub union Variant {
pub v: InnerVariant,
pub dec: Decimal,
}
impl Variant {
pub fn vartype(&self) -> VarType {
unsafe { self.v.vartype }
}
pub fn new_i8(val: i8) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::I1;
v.v.data.c_val = val;
v
}
}
pub fn new_u8(val: u8) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::UI1;
v.v.data.b_val = val;
v
}
}
pub fn new_i16(val: i16) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::I2;
v.v.data.i_val = val;
v
}
}
pub fn new_u16(val: u16) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::UI2;
v.v.data.ui_val = val;
v
}
}
pub fn new_i32(val: i32) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::I4;
v.v.data.l_val = val;
v
}
}
pub fn new_u32(val: u32) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::UI4;
v.v.data.ul_val = val;
v
}
}
pub fn new_i64(val: i64) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::I8;
v.v.data.ll_val = val;
v
}
}
pub fn new_u64(val: u64) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::UI8;
v.v.data.ull_val = val;
v
}
}
pub fn new_f32(val: f32) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::R4;
v.v.data.flt_val = val;
v
}
}
pub fn new_f64(val: f64) -> Variant {
unsafe {
let mut v: Variant = std::mem::zeroed();
v.v.vartype = VarType::R8;
v.v.data.dbl_val = val;
v
}
}
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct InnerVariant {
pub vartype: VarType,
pub reserved1: u16,
pub reserved2: u16,
pub reserved3: u16,
pub data: InnerVariantData,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union InnerVariantData {
pub ll_val: i64,
pub l_val: i32,
pub b_val: u8,
pub i_val: i16,
pub flt_val: f32,
pub dbl_val: f64,
pub bool_val: i16,
pub scode: i32,
pub cy_val: i64,
pub date: f64,
pub bstr_val: BSTR,
pub punk_val: *mut IUnknown,
pub pdisp_val: *mut IDispatch,
pub parray: *mut SafeArray,
pub pb_val: *mut u8,
pub pi_val: *mut i16,
pub pl_val: *mut i32,
pub pll_val: *mut i64,
pub pflt_val: *mut f32,
pub pdbl_val: *mut f64,
pub pbool_val: *mut i16,
pub pscode: *mut i32,
pub pcy_val: *mut i64,
pub pdate: *mut f64,
pub pbstr_val: *mut BSTR,
pub ppunk_val: *mut *mut IUnknown,
pub ppdisp_val: *mut *mut IDispatch,
pub pparray: *mut *mut SafeArray,
pub pvar_val: *mut Variant,
pub byref: *mut c_void,
pub c_val: i8,
pub ui_val: u16,
pub ul_val: u32,
pub ull_val: u64,
pub int_val: i32,
pub uint_val: u32,
pub pdec_val: *mut Decimal,
pub pc_val: *mut i8,
pub pui_val: *mut u16,
pub pul_val: *mut u32,
pub pull_val: *mut u64,
pub pint_val: *mut i32,
pub puint_val: *mut u32,
}