Skip to main content

moq_vaapi/
generic_value.rs

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.
4
5use thiserror::Error;
6
7use crate::bindings;
8
9/// A wrapper over `VAGenericValue` giving us safe access to the underlying union members.
10#[derive(Debug)]
11pub enum GenericValue {
12	/// A wrapper over VAGenericValueTypeInteger
13	Integer(i32),
14	/// A wrapper over VAGenericValueTypeFloat
15	Float(f32),
16	/// A wrapper over VAGenericValueTypePointer
17	Pointer(*mut std::os::raw::c_void),
18	/// A wrapper over VAGenericValueTypeFunc
19	Func(bindings::VAGenericFunc),
20}
21
22#[derive(Debug, Error)]
23pub enum GenericValueError {
24	#[error("unexpected VAGenericValueType {0}")]
25	UnexpectedType(u32),
26}
27
28impl TryFrom<bindings::VAGenericValue> for GenericValue {
29	type Error = GenericValueError;
30
31	fn try_from(value: bindings::VAGenericValue) -> Result<Self, Self::Error> {
32		// Safe because we check the type before accessing the union.
33		match value.type_ {
34			// Safe because we check the type before accessing the union.
35			bindings::VAGenericValueType::VAGenericValueTypeInteger => Ok(Self::Integer(unsafe { value.value.i })),
36			bindings::VAGenericValueType::VAGenericValueTypeFloat => Ok(Self::Float(unsafe { value.value.f })),
37			bindings::VAGenericValueType::VAGenericValueTypePointer => Ok(Self::Pointer(unsafe { value.value.p })),
38			bindings::VAGenericValueType::VAGenericValueTypeFunc => Ok(Self::Func(unsafe { value.value.fn_ })),
39			_ => Err(GenericValueError::UnexpectedType(value.type_)),
40		}
41	}
42}