blob: f95ff855b050adef70fafa348ff8d09eeac51bb3 [file] [log] [blame]
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use num_enum::TryFromPrimitive;
/// Rust Error enum used for representing an SDK error with postcard. This is
/// what most rust components will actually use as their error handling enum.
#[derive(Debug, Eq, PartialEq)]
pub enum SDKError {
DeserializeFailed,
SerializeFailed,
InvalidBadge,
InvalidString,
ReadKeyFailed,
WriteKeyFailed,
DeleteKeyFailed,
MapPageFailed,
UnknownRequest,
UnknownResponse,
NoSuchTimer,
TimerAlreadyExists,
NoPlatformSupport,
NoSuchModel,
InvalidTimer,
LoadModelFailed,
OutOfResources,
NoModelOutput,
InvalidInputRange,
InvalidAudioParameter,
InvalidAudioState,
}
impl From<postcard::Error> for SDKError {
fn from(_err: postcard::Error) -> SDKError { SDKError::SerializeFailed }
}
/// SDKError presented over the seL4 IPC interface. We need repr(seL4_Word)
/// but cannot use that so use the implied usize type instead.
#[repr(usize)]
#[derive(Debug, Eq, PartialEq, TryFromPrimitive)]
pub enum SDKRuntimeError {
SDKSuccess = 0,
SDKDeserializeFailed,
SDKSerializeFailed,
SDKInvalidBadge,
SDKInvalidString,
SDKReadKeyFailed,
SDKWriteKeyFailed,
SDKDeleteKeyFailed,
SDKMapPageFailed,
SDKUnknownRequest,
SDKUnknownResponse,
SDKNoSuchTimer,
SDKTimerAlreadyExists,
SDKNoPlatformSupport,
SDKNoSuchModel,
SDKInvalidTimer,
SDKLoadModelFailed,
SDKOutOfResources,
SDKNoModelOutput,
SDKInvalidInputRange,
SDKInvalidAudioParameter,
SDKInvalidAudioState,
}
/// Mapping function from Rust -> C.
impl From<SDKError> for SDKRuntimeError {
fn from(err: SDKError) -> SDKRuntimeError {
match err {
SDKError::DeserializeFailed => SDKRuntimeError::SDKDeserializeFailed,
SDKError::SerializeFailed => SDKRuntimeError::SDKSerializeFailed,
SDKError::InvalidBadge => SDKRuntimeError::SDKInvalidBadge,
SDKError::InvalidString => SDKRuntimeError::SDKInvalidString,
SDKError::ReadKeyFailed => SDKRuntimeError::SDKReadKeyFailed,
SDKError::WriteKeyFailed => SDKRuntimeError::SDKWriteKeyFailed,
SDKError::DeleteKeyFailed => SDKRuntimeError::SDKDeleteKeyFailed,
SDKError::MapPageFailed => SDKRuntimeError::SDKMapPageFailed,
SDKError::NoSuchTimer => SDKRuntimeError::SDKNoSuchTimer,
SDKError::TimerAlreadyExists => SDKRuntimeError::SDKTimerAlreadyExists,
SDKError::UnknownRequest => SDKRuntimeError::SDKUnknownRequest,
SDKError::UnknownResponse => SDKRuntimeError::SDKUnknownResponse,
SDKError::NoPlatformSupport => SDKRuntimeError::SDKNoPlatformSupport,
SDKError::NoSuchModel => SDKRuntimeError::SDKNoSuchModel,
SDKError::InvalidTimer => SDKRuntimeError::SDKInvalidTimer,
SDKError::LoadModelFailed => SDKRuntimeError::SDKLoadModelFailed,
SDKError::OutOfResources => SDKRuntimeError::SDKOutOfResources,
SDKError::NoModelOutput => SDKRuntimeError::SDKNoModelOutput,
SDKError::InvalidInputRange => SDKRuntimeError::SDKInvalidInputRange,
SDKError::InvalidAudioParameter => SDKRuntimeError::SDKInvalidAudioParameter,
SDKError::InvalidAudioState => SDKRuntimeError::SDKInvalidAudioState,
}
}
}
/// Helper to map from a Result and SDKError to C enum mapping.
impl From<Result<(), SDKError>> for SDKRuntimeError {
fn from(result: Result<(), SDKError>) -> SDKRuntimeError {
result.map_or_else(SDKRuntimeError::from, |_| SDKRuntimeError::SDKSuccess)
}
}
/// Inverse mapping function from C -> Rust Result.
impl From<SDKRuntimeError> for Result<(), SDKError> {
fn from(err: SDKRuntimeError) -> Result<(), SDKError> {
match err {
SDKRuntimeError::SDKSuccess => Ok(()),
SDKRuntimeError::SDKDeserializeFailed => Err(SDKError::DeserializeFailed),
SDKRuntimeError::SDKSerializeFailed => Err(SDKError::SerializeFailed),
SDKRuntimeError::SDKInvalidBadge => Err(SDKError::InvalidBadge),
SDKRuntimeError::SDKInvalidString => Err(SDKError::InvalidString),
SDKRuntimeError::SDKReadKeyFailed => Err(SDKError::ReadKeyFailed),
SDKRuntimeError::SDKWriteKeyFailed => Err(SDKError::WriteKeyFailed),
SDKRuntimeError::SDKDeleteKeyFailed => Err(SDKError::DeleteKeyFailed),
SDKRuntimeError::SDKMapPageFailed => Err(SDKError::DeleteKeyFailed),
SDKRuntimeError::SDKNoSuchTimer => Err(SDKError::NoSuchTimer),
SDKRuntimeError::SDKTimerAlreadyExists => Err(SDKError::TimerAlreadyExists),
SDKRuntimeError::SDKUnknownRequest => Err(SDKError::UnknownRequest),
SDKRuntimeError::SDKUnknownResponse => Err(SDKError::UnknownResponse),
SDKRuntimeError::SDKNoPlatformSupport => Err(SDKError::NoPlatformSupport),
SDKRuntimeError::SDKNoSuchModel => Err(SDKError::NoSuchModel),
SDKRuntimeError::SDKInvalidTimer => Err(SDKError::InvalidTimer),
SDKRuntimeError::SDKLoadModelFailed => Err(SDKError::LoadModelFailed),
SDKRuntimeError::SDKOutOfResources => Err(SDKError::OutOfResources),
SDKRuntimeError::SDKNoModelOutput => Err(SDKError::NoModelOutput),
SDKRuntimeError::SDKInvalidInputRange => Err(SDKError::InvalidInputRange),
SDKRuntimeError::SDKInvalidAudioParameter => Err(SDKError::InvalidAudioParameter),
SDKRuntimeError::SDKInvalidAudioState => Err(SDKError::InvalidAudioState),
}
}
}