test-smi-rs 0.1.2

APIs for managing and monitoring FuriosaAI NPUs
Documentation
#![allow(non_upper_case_globals)]

use crate::generated::binding::*;
use thiserror::Error;

/// Represents a result of Furiosa SMI API function
pub type SmiResult<T> = Result<T, SmiError>;

#[derive(Debug, Error)]
/// Represents a error status
pub enum SmiError {
    #[error("Invalid argument error")]
    /// When an invalid argument is given.
    InvalidArgumentError,
    #[error("Null pointer error")]
    /// When a null pointer is given to output buffer.
    NullPointerError,
    #[error("Max buffer size exceeded error")]
    /// When a data exceeds the maximum buffer size.
    MaxBufferSizeExceedError,
    #[error("Device not found error")]
    /// When a device is not found with the given option.
    DeviceNotFoundError,
    #[error("Device busy error")]
    /// When a device state is busy.
    DeviceBusyError,
    #[error("Io error")]
    /// When a certain operation is failed by an unexpected io error.
    IoError,
    #[error("Permission denied error")]
    /// When a certain operation is failed by a permission denial.
    PermissionDeniedError,
    #[error("Unknown arch error")]
    /// When an arch is unknown.
    UnknownArchError,
    #[error("Incompatible driver error")]
    /// When a driver is incompatible.
    IncompatibleDriverError,
    #[error("Unexpected value error")]
    /// When a retrieved value is invalid.
    UnexpectedValueError,
    #[error("Parse error")]
    /// When a certain parsing operation is failed.
    ParseError,
    #[error("Unknown error")]
    /// When a reason is unknown.
    UnknownError,
    #[error("Internal error")]
    /// When an internal operation is failed.
    InternalError,
    #[error("Uninitialized error")]
    /// When the system is not initialized.
    UninitializedError,
    #[error("Context error")]
    /// When a context cannot be captured.
    ContextError,
    /// When a certail operation is not supported.
    #[error("Not supported error")]
    NotSupportedError,
}

impl SmiError {
    pub(crate) fn from(code: FuriosaSmiReturnCode) -> SmiError {
        match code {
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_INVALID_ARGUMENT_ERROR => {
                SmiError::InvalidArgumentError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_NULL_POINTER_ERROR => {
                SmiError::NullPointerError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_MAX_BUFFER_SIZE_EXCEED_ERROR => {
                SmiError::MaxBufferSizeExceedError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_DEVICE_NOT_FOUND_ERROR => {
                SmiError::DeviceNotFoundError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_DEVICE_BUSY_ERROR => {
                SmiError::DeviceBusyError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_IO_ERROR => SmiError::IoError,
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_PERMISSION_DENIED_ERROR => {
                SmiError::PermissionDeniedError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_UNKNOWN_ARCH_ERROR => {
                SmiError::UnknownArchError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_INCOMPATIBLE_DRIVER_ERROR => {
                SmiError::IncompatibleDriverError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_UNEXPECTED_VALUE_ERROR => {
                SmiError::UnexpectedValueError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_PARSE_ERROR => SmiError::ParseError,
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_UNKNOWN_ERROR => SmiError::UnknownError,
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_INTERNAL_ERROR => SmiError::InternalError,
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_UNINITIALIZED_ERROR => {
                SmiError::UninitializedError
            }
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_CONTEXT_ERROR => SmiError::ContextError,
            FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_NOT_SUPPORTED_ERROR => {
                SmiError::NotSupportedError
            }
            _ => panic!("unknown error code"),
        }
    }
}