mirror of
https://github.com/aramperes/nut-rs.git
synced 2025-09-09 05:28:31 -04:00
Add all remaining errors
This commit is contained in:
parent
1842ebef15
commit
35d40d3111
2 changed files with 104 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::proto::ClientSentences;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
|
@ -8,6 +9,48 @@ pub enum NutError {
|
||||||
AccessDenied,
|
AccessDenied,
|
||||||
/// Occurs when the specified UPS device does not exist.
|
/// Occurs when the specified UPS device does not exist.
|
||||||
UnknownUps,
|
UnknownUps,
|
||||||
|
/// The specified UPS doesn't support the variable in the request.
|
||||||
|
VarNotSupported,
|
||||||
|
/// The specified UPS doesn't support the instant command in the request.
|
||||||
|
CmdNotSupported,
|
||||||
|
/// The client sent an argument to a command which is not recognized or is otherwise invalid in this context.
|
||||||
|
InvalidArgument,
|
||||||
|
/// Server failed to deliver the instant command request to the driver. No further information is available to the client.
|
||||||
|
InstCmdFailed,
|
||||||
|
/// Server failed to deliver the set request to the driver.
|
||||||
|
SetFailed,
|
||||||
|
/// The requested variable in a SET command is not writable.
|
||||||
|
ReadOnly,
|
||||||
|
/// The requested value in a SET command is too long.
|
||||||
|
TooLong,
|
||||||
|
/// The server does not support the requested feature.
|
||||||
|
FeatureNotSupported,
|
||||||
|
/// TLS/SSL mode is already enabled on this connection, so the server can't start it again.
|
||||||
|
AlreadySslMode,
|
||||||
|
/// The server can't perform the requested command, since the driver for that UPS is not connected.
|
||||||
|
DriverNotConnected,
|
||||||
|
/// Server is connected to the driver for the UPS, but that driver isn't providing regular updates
|
||||||
|
/// or has specifically marked the data as stale.
|
||||||
|
DataStale,
|
||||||
|
/// The client already sent LOGIN for a UPS and can't do it again.
|
||||||
|
/// There is presently a limit of one LOGIN record per connection.
|
||||||
|
AlreadyLoggedIn,
|
||||||
|
/// The client sent an invalid PASSWORD - perhaps an empty one.
|
||||||
|
InvalidPassword,
|
||||||
|
/// The client already set a PASSWORD and can't set another.
|
||||||
|
AlreadySetPassword,
|
||||||
|
/// The client sent an invalid USERNAME.
|
||||||
|
InvalidUsername,
|
||||||
|
/// The client has already set a USERNAME, and can't set another.
|
||||||
|
AlreadySetUsername,
|
||||||
|
/// The requested command requires a username for authentication, but the client hasn't set one.
|
||||||
|
UsernameRequired,
|
||||||
|
/// The requested command requires a password for authentication, but the client hasn't set one.
|
||||||
|
PasswordRequired,
|
||||||
|
/// The server doesn't recognize the requested command.
|
||||||
|
UnknownCommand,
|
||||||
|
/// The value specified in the request is not valid.
|
||||||
|
InvalidValue,
|
||||||
/// Occurs when the response type or content wasn't expected at the current stage.
|
/// Occurs when the response type or content wasn't expected at the current stage.
|
||||||
UnexpectedResponse,
|
UnexpectedResponse,
|
||||||
/// Occurs when the response type is not recognized by the client.
|
/// Occurs when the response type is not recognized by the client.
|
||||||
|
@ -26,8 +69,28 @@ pub enum NutError {
|
||||||
impl fmt::Display for NutError {
|
impl fmt::Display for NutError {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Self::AccessDenied => write!(f, "Authentication failed"),
|
Self::AccessDenied => write!(f, "Access denied"),
|
||||||
Self::UnknownUps => write!(f, "Unknown UPS device name"),
|
Self::UnknownUps => write!(f, "Unknown UPS device"),
|
||||||
|
Self::VarNotSupported => write!(f, "Variable not supported"),
|
||||||
|
Self::CmdNotSupported => write!(f, "Command not supported"),
|
||||||
|
Self::InvalidArgument => write!(f, "Invalid argument"),
|
||||||
|
Self::InstCmdFailed => write!(f, "Instant command failed"),
|
||||||
|
Self::SetFailed => write!(f, "Failed to set variable"),
|
||||||
|
Self::ReadOnly => write!(f, "Cannot set read-only variable"),
|
||||||
|
Self::TooLong => write!(f, "Value is too long"),
|
||||||
|
Self::FeatureNotSupported => write!(f, "Feature is not supported by server"),
|
||||||
|
Self::AlreadySslMode => write!(f, "Connection is already in TLS/SSL"),
|
||||||
|
Self::DriverNotConnected => write!(f, "Driver is not connected"),
|
||||||
|
Self::DataStale => write!(f, "Data is stale"),
|
||||||
|
Self::AlreadyLoggedIn => write!(f, "Connection is already authenticated"),
|
||||||
|
Self::InvalidPassword => write!(f, "Invalid password"),
|
||||||
|
Self::AlreadySetPassword => write!(f, "Password can only be set once"),
|
||||||
|
Self::InvalidUsername => write!(f, "Invalid username"),
|
||||||
|
Self::AlreadySetUsername => write!(f, "Username can only be set once"),
|
||||||
|
Self::UsernameRequired => write!(f, "Username required"),
|
||||||
|
Self::PasswordRequired => write!(f, "Password required"),
|
||||||
|
Self::UnknownCommand => write!(f, "Unknown command"),
|
||||||
|
Self::InvalidValue => write!(f, "Invalid value"),
|
||||||
Self::UnexpectedResponse => write!(f, "Unexpected server response content"),
|
Self::UnexpectedResponse => write!(f, "Unexpected server response content"),
|
||||||
Self::UnknownResponseType(ty) => write!(f, "Unknown response type: {}", ty),
|
Self::UnknownResponseType(ty) => write!(f, "Unknown response type: {}", ty),
|
||||||
Self::SslNotSupported => write!(f, "SSL not supported by server or transport"),
|
Self::SslNotSupported => write!(f, "SSL not supported by server or transport"),
|
||||||
|
@ -41,6 +104,42 @@ impl fmt::Display for NutError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: AsRef<ClientSentences>> From<T> for NutError {
|
||||||
|
fn from(sentence: T) -> Self {
|
||||||
|
if let ClientSentences::RespondErr { message, .. } = sentence.as_ref() {
|
||||||
|
match message.as_str() {
|
||||||
|
"ACCESS-DENIED" => Self::AccessDenied,
|
||||||
|
"UNKNOWN-UPS" => Self::UnknownUps,
|
||||||
|
"VAR-NOT-SUPPORTED" => Self::VarNotSupported,
|
||||||
|
"CMD-NOT-SUPPORTED" => Self::CmdNotSupported,
|
||||||
|
"INVALID-ARGUMENT" => Self::InvalidArgument,
|
||||||
|
"INSTCMD-FAILED" => Self::InstCmdFailed,
|
||||||
|
"SET-FAILED" => Self::SetFailed,
|
||||||
|
"READONLY" => Self::ReadOnly,
|
||||||
|
"TOO-LONG" => Self::TooLong,
|
||||||
|
"FEATURE-NOT-SUPPORTED" => Self::FeatureNotSupported,
|
||||||
|
"FEATURE-NOT-CONFIGURED" => Self::FeatureNotConfigured,
|
||||||
|
"ALREADY-SSL-MODE" => Self::AlreadySslMode,
|
||||||
|
"DRIVER-NOT-CONNECTED" => Self::DriverNotConnected,
|
||||||
|
"DATA-STALE" => Self::DataStale,
|
||||||
|
"ALREADY-LOGGED-IN" => Self::AlreadyLoggedIn,
|
||||||
|
"INVALID-PASSWORD" => Self::InvalidPassword,
|
||||||
|
"ALREADY-SET-PASSWORD" => Self::AlreadySetPassword,
|
||||||
|
"INVALID-USERNAME" => Self::InvalidUsername,
|
||||||
|
"ALREADY-SET-USERNAME" => Self::AlreadySetUsername,
|
||||||
|
"USERNAME-REQUIRED" => Self::UsernameRequired,
|
||||||
|
"PASSWORD-REQUIRED" => Self::PasswordRequired,
|
||||||
|
"UNKNOWN-COMMAND" => Self::UnknownCommand,
|
||||||
|
"INVALID-VALUE" => Self::InvalidValue,
|
||||||
|
_ => Self::Generic(message.to_string()),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This is not supposed to happen...
|
||||||
|
panic!("Cannot convert {:?} into NutError", sentence.as_ref());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl NutError {
|
impl NutError {
|
||||||
/// Constructs a generic rups error.
|
/// Constructs a generic rups error.
|
||||||
pub fn generic<T: ToString>(message: T) -> Self {
|
pub fn generic<T: ToString>(message: T) -> Self {
|
||||||
|
|
|
@ -11,6 +11,9 @@ pub mod server;
|
||||||
/// Utilities for encoding and decoding packets.
|
/// Utilities for encoding and decoding packets.
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
pub use client::Sentences as ClientSentences;
|
||||||
|
pub use server::Sentences as ServerSentences;
|
||||||
|
|
||||||
/// Macro that implements the list of "words" in the NUT network protocol.
|
/// Macro that implements the list of "words" in the NUT network protocol.
|
||||||
macro_rules! impl_words {
|
macro_rules! impl_words {
|
||||||
(
|
(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue