use strum::{Display, FromRepr};
use crate::MCUmgrGroup;
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum DeviceError {
V1 {
rc: i32,
rsn: Option<String>,
},
V2 {
group: u16,
rc: i32,
},
}
fn v2_err_to_string(group: u16, rc: i32) -> Option<String> {
match MCUmgrGroup::from_repr(group)? {
MCUmgrGroup::MGMT_GROUP_ID_ENUM => EnumMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::MGMT_GROUP_ID_FS => FsMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::MGMT_GROUP_ID_IMAGE => ImgMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::MGMT_GROUP_ID_OS => OsMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::MGMT_GROUP_ID_SETTINGS => {
SettingsMgmtRetCode::from_repr(rc).map(|x| x.to_string())
}
MCUmgrGroup::MGMT_GROUP_ID_SHELL => ShellMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::MGMT_GROUP_ID_STAT => StatMgmtErrCode::from_repr(rc).map(|x| x.to_string()),
MCUmgrGroup::ZEPHYR_MGMT_GRP_BASIC => {
ZephyrBasicGroupErrCode::from_repr(rc).map(|x| x.to_string())
}
_ => None,
}
}
impl std::fmt::Display for DeviceError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DeviceError::V1 { rc, rsn } => {
if let Some(rsn) = rsn {
write!(f, "{}: {}", MCUmgrErr::err_to_string(*rc), rsn)
} else {
write!(f, "{}", MCUmgrErr::err_to_string(*rc))
}
}
DeviceError::V2 { group, rc } => match v2_err_to_string(*group, *rc) {
Some(msg) => f.write_str(&msg),
None => write!(f, "group={group},rc={rc}"),
},
}
}
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum MCUmgrErr {
MGMT_ERR_EOK = 0,
MGMT_ERR_EUNKNOWN,
MGMT_ERR_ENOMEM,
MGMT_ERR_EINVAL,
MGMT_ERR_ETIMEOUT,
MGMT_ERR_ENOENT,
MGMT_ERR_EBADSTATE,
MGMT_ERR_EMSGSIZE,
MGMT_ERR_ENOTSUP,
MGMT_ERR_ECORRUPT,
MGMT_ERR_EBUSY,
MGMT_ERR_EACCESSDENIED,
MGMT_ERR_UNSUPPORTED_TOO_OLD,
MGMT_ERR_UNSUPPORTED_TOO_NEW,
MGMT_ERR_EPERUSER = 256,
}
impl MCUmgrErr {
pub fn err_to_string(err: i32) -> String {
const PERUSER: MCUmgrErr = MCUmgrErr::MGMT_ERR_EPERUSER;
if err < PERUSER as i32 {
if let Some(err_enum) = Self::from_repr(err) {
format!("{err_enum}")
} else {
format!("MGMT_ERR_UNKNOWN({err})")
}
} else {
format!("{PERUSER}({err})")
}
}
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum SettingsMgmtRetCode {
SETTINGS_MGMT_ERR_OK = 0,
SETTINGS_MGMT_ERR_UNKNOWN,
SETTINGS_MGMT_ERR_KEY_TOO_LONG,
SETTINGS_MGMT_ERR_KEY_NOT_FOUND,
SETTINGS_MGMT_ERR_READ_NOT_SUPPORTED,
SETTINGS_MGMT_ERR_ROOT_KEY_NOT_FOUND,
SETTINGS_MGMT_ERR_WRITE_NOT_SUPPORTED,
SETTINGS_MGMT_ERR_DELETE_NOT_SUPPORTED,
SETTINGS_MGMT_ERR_SAVE_NOT_SUPPORTED,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum FsMgmtErrCode {
FS_MGMT_ERR_OK = 0,
FS_MGMT_ERR_UNKNOWN,
FS_MGMT_ERR_FILE_INVALID_NAME,
FS_MGMT_ERR_FILE_NOT_FOUND,
FS_MGMT_ERR_FILE_IS_DIRECTORY,
FS_MGMT_ERR_FILE_OPEN_FAILED,
FS_MGMT_ERR_FILE_SEEK_FAILED,
FS_MGMT_ERR_FILE_READ_FAILED,
FS_MGMT_ERR_FILE_TRUNCATE_FAILED,
FS_MGMT_ERR_FILE_DELETE_FAILED,
FS_MGMT_ERR_FILE_WRITE_FAILED,
FS_MGMT_ERR_FILE_OFFSET_NOT_VALID,
FS_MGMT_ERR_FILE_OFFSET_LARGER_THAN_FILE,
FS_MGMT_ERR_CHECKSUM_HASH_NOT_FOUND,
FS_MGMT_ERR_MOUNT_POINT_NOT_FOUND,
FS_MGMT_ERR_READ_ONLY_FILESYSTEM,
FS_MGMT_ERR_FILE_EMPTY,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum ImgMgmtErrCode {
IMG_MGMT_ERR_OK = 0,
IMG_MGMT_ERR_UNKNOWN,
IMG_MGMT_ERR_FLASH_CONFIG_QUERY_FAIL,
IMG_MGMT_ERR_NO_IMAGE,
IMG_MGMT_ERR_NO_TLVS,
IMG_MGMT_ERR_INVALID_TLV,
IMG_MGMT_ERR_TLV_MULTIPLE_HASHES_FOUND,
IMG_MGMT_ERR_TLV_INVALID_SIZE,
IMG_MGMT_ERR_HASH_NOT_FOUND,
IMG_MGMT_ERR_NO_FREE_SLOT,
IMG_MGMT_ERR_FLASH_OPEN_FAILED,
IMG_MGMT_ERR_FLASH_READ_FAILED,
IMG_MGMT_ERR_FLASH_WRITE_FAILED,
IMG_MGMT_ERR_FLASH_ERASE_FAILED,
IMG_MGMT_ERR_INVALID_SLOT,
IMG_MGMT_ERR_NO_FREE_MEMORY,
IMG_MGMT_ERR_FLASH_CONTEXT_ALREADY_SET,
IMG_MGMT_ERR_FLASH_CONTEXT_NOT_SET,
IMG_MGMT_ERR_FLASH_AREA_DEVICE_NULL,
IMG_MGMT_ERR_INVALID_PAGE_OFFSET,
IMG_MGMT_ERR_INVALID_OFFSET,
IMG_MGMT_ERR_INVALID_LENGTH,
IMG_MGMT_ERR_INVALID_IMAGE_HEADER,
IMG_MGMT_ERR_INVALID_IMAGE_HEADER_MAGIC,
IMG_MGMT_ERR_INVALID_HASH,
IMG_MGMT_ERR_INVALID_FLASH_ADDRESS,
IMG_MGMT_ERR_VERSION_GET_FAILED,
IMG_MGMT_ERR_CURRENT_VERSION_IS_NEWER,
IMG_MGMT_ERR_IMAGE_ALREADY_PENDING,
IMG_MGMT_ERR_INVALID_IMAGE_VECTOR_TABLE,
IMG_MGMT_ERR_INVALID_IMAGE_TOO_LARGE,
IMG_MGMT_ERR_INVALID_IMAGE_DATA_OVERRUN,
IMG_MGMT_ERR_IMAGE_CONFIRMATION_DENIED,
IMG_MGMT_ERR_IMAGE_SETTING_TEST_TO_ACTIVE_DENIED,
IMG_MGMT_ERR_ACTIVE_SLOT_NOT_KNOWN,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum OsMgmtErrCode {
OS_MGMT_ERR_OK = 0,
OS_MGMT_ERR_UNKNOWN,
OS_MGMT_ERR_INVALID_FORMAT,
OS_MGMT_ERR_QUERY_YIELDS_NO_ANSWER,
OS_MGMT_ERR_RTC_NOT_SET,
OS_MGMT_ERR_RTC_COMMAND_FAILED,
OS_MGMT_ERR_QUERY_RESPONSE_VALUE_NOT_VALID,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum ShellMgmtErrCode {
SHELL_MGMT_ERR_OK = 0,
SHELL_MGMT_ERR_UNKNOWN,
SHELL_MGMT_ERR_COMMAND_TOO_LONG,
SHELL_MGMT_ERR_EMPTY_COMMAND,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum StatMgmtErrCode {
STAT_MGMT_ERR_OK = 0,
STAT_MGMT_ERR_UNKNOWN,
STAT_MGMT_ERR_INVALID_GROUP,
STAT_MGMT_ERR_INVALID_STAT_NAME,
STAT_MGMT_ERR_INVALID_STAT_SIZE,
STAT_MGMT_ERR_WALK_ABORTED,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum EnumMgmtErrCode {
ENUM_MGMT_ERR_OK = 0,
ENUM_MGMT_ERR_UNKNOWN,
ENUM_MGMT_ERR_TOO_MANY_GROUP_ENTRIES,
ENUM_MGMT_ERR_INSUFFICIENT_HEAP_FOR_ENTRIES,
ENUM_MGMT_ERR_INDEX_TOO_LARGE,
}
#[derive(FromRepr, Display, Debug, Copy, Clone, PartialEq, Eq)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum ZephyrBasicGroupErrCode {
ZEPHYRBASIC_MGMT_ERR_OK = 0,
ZEPHYRBASIC_MGMT_ERR_UNKNOWN,
ZEPHYRBASIC_MGMT_ERR_FLASH_OPEN_FAILED,
ZEPHYRBASIC_MGMT_ERR_FLASH_CONFIG_QUERY_FAIL,
ZEPHYRBASIC_MGMT_ERR_FLASH_ERASE_FAILED,
}