1 // Copyright 2022 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
10 /// A wrapper over `VAGenericValue` giving us safe access to the underlying union members.
12 pub enum GenericValue {
13 /// A wrapper over VAGenericValueTypeInteger
15 /// A wrapper over VAGenericValueTypeFloat
17 /// A wrapper over VAGenericValueTypePointer
18 Pointer(*mut std::os::raw::c_void),
19 /// A wrapper over VAGenericValueTypeFunc
20 Func(bindings::VAGenericFunc),
23 impl TryFrom<bindings::VAGenericValue> for GenericValue {
24 type Error = anyhow::Error;
26 fn try_from(value: bindings::VAGenericValue) -> Result<Self, Self::Error> {
27 // Safe because we check the type before accessing the union.
29 // Safe because we check the type before accessing the union.
30 bindings::VAGenericValueType::VAGenericValueTypeInteger => {
31 Ok(Self::Integer(unsafe { value.value.i }))
33 bindings::VAGenericValueType::VAGenericValueTypeFloat => {
34 Ok(Self::Float(unsafe { value.value.f }))
36 bindings::VAGenericValueType::VAGenericValueTypePointer => {
37 Ok(Self::Pointer(unsafe { value.value.p }))
39 bindings::VAGenericValueType::VAGenericValueTypeFunc => {
40 Ok(Self::Func(unsafe { value.value.fn_ }))
43 "Conversion failed for unexpected VAGenericValueType: {}",