use thiserror::Error;
use crate::bindings;
#[derive(Debug)]
pub enum GenericValue {
Integer(i32),
Float(f32),
Pointer(*mut std::os::raw::c_void),
Func(bindings::VAGenericFunc),
}
#[derive(Debug, Error)]
pub enum GenericValueError {
#[error("unexpected VAGenericValueType {0}")]
UnexpectedType(u32),
}
impl TryFrom<bindings::VAGenericValue> for GenericValue {
type Error = GenericValueError;
fn try_from(value: bindings::VAGenericValue) -> Result<Self, Self::Error> {
match value.type_ {
bindings::VAGenericValueType::VAGenericValueTypeInteger => {
Ok(Self::Integer(unsafe { value.value.i }))
}
bindings::VAGenericValueType::VAGenericValueTypeFloat => {
Ok(Self::Float(unsafe { value.value.f }))
}
bindings::VAGenericValueType::VAGenericValueTypePointer => {
Ok(Self::Pointer(unsafe { value.value.p }))
}
bindings::VAGenericValueType::VAGenericValueTypeFunc => {
Ok(Self::Func(unsafe { value.value.fn_ }))
}
_ => Err(GenericValueError::UnexpectedType(value.type_)),
}
}
}