use std::{num, ffi, convert};
use errno::{Errno, errno};
use shims::constants;
custom_error::custom_error! {
#[derive(PartialEq, Eq)]
pub NCurseswMenuError
BadArgument { func: String } = "nmenu::{func}() : bad argument",
BadState { func: String } = "nmenu::{func}() : bad state",
Connected { func: String } = "nmenu::{func}() : connected",
Current { func: String } = "nmenu::{func}() : current",
InvalidField { func: String } = "nmenu::{func}() : invalid field",
NotConnected { func: String } = "nmenu::{func}() : not connected",
NotPosted { func: String } = "nmenu::{func}() : not posted",
NotSelectable { func: String } = "nmenu::{func}() : not selectable",
NoMatch { func: String } = "nmenu::{func}() : no match",
NoRoom { func: String } = "nmenu::{func}() : no room",
Ok { func: String } = "nmenu::{func}() : ok",
Posted { func: String } = "nmenu::{func}() : posted",
RequestDenied { func: String } = "nmenu::{func}() : request denied",
SystemError { func: String, errno: Errno } = @{ format!("nmenu::{}() : {} (#{})", func, errno, errno.0) },
UnknownCommand { func: String } = "nmenu::{func}() : unknown command",
UnknownError { func: String, errno: i32 } = "nmenu::{func} : error number {errno}",
IntError { source: num::TryFromIntError } = "{source}",
NulError { source: ffi::NulError } = "{source}",
Infallible { source: convert::Infallible } = "{source}"
}
pub fn ncursesw_menu_error_from_rc(func: &str, err: i32) -> NCurseswMenuError {
let func = func.to_string();
match err {
constants::E_BAD_ARGUMENT => NCurseswMenuError::BadArgument { func },
constants::E_BAD_STATE => NCurseswMenuError::BadState { func },
constants::E_CONNECTED => NCurseswMenuError::Connected { func },
constants::E_CURRENT => NCurseswMenuError::Current { func },
constants::E_INVALID_FIELD => NCurseswMenuError::InvalidField { func },
constants::E_NOT_CONNECTED => NCurseswMenuError::NotConnected { func },
constants::E_NOT_POSTED => NCurseswMenuError::NotPosted { func },
constants::E_NOT_SELECTABLE => NCurseswMenuError::NotSelectable { func },
constants::E_NO_MATCH => NCurseswMenuError::NoMatch { func },
constants::E_NO_ROOM => NCurseswMenuError::NoRoom { func },
constants::E_OK => NCurseswMenuError::Ok { func },
constants::E_POSTED => NCurseswMenuError::Posted { func },
constants::E_REQUEST_DENIED => NCurseswMenuError::RequestDenied { func },
constants::E_SYSTEM_ERROR => NCurseswMenuError::SystemError { func, errno: errno() },
constants::E_UNKNOWN_COMMAND => NCurseswMenuError::UnknownCommand { func },
_ => NCurseswMenuError::UnknownError { func, errno: err }
}
}
pub(in crate::menu) fn ncursesw_menu_error_system_error(func: &str) -> NCurseswMenuError {
NCurseswMenuError::SystemError { func: func.to_string(), errno: errno() }
}