powercom-upsmonpro-state-parser 1.0.0

Parser of POWERCOM UPS state provided by UPSMON Pro software
Documentation
use std::fmt;
use std::num::ParseIntError;
use std::error::Error as StdError;

#[derive(Debug)]
#[derive(PartialEq)]
pub enum Error {
    CanNotParseVoltage{line: String, err: ParseIntError}, 
    CanNotParseFrequency{line: String, err: ParseIntError}, 
    CanNotParseChargePercent{line: String, err: ParseIntError}, 
    CanNotParseLoadPercent{line: String, err: ParseIntError}, 
    CanNotParseUPSMode{line: String}, 
    CanNotParseMainsState{line: String}, 
    CanNotParseUPSConnectionStatus{line: String}, 
    CanNotParseTemperature{line: String, err: ParseIntError}, 
    ChargePercentOutOfRange{charge_percent: u8}, 
    UPSStateStringTooShort{ups_state: String}, 
    InternalError{description: String}
}

impl fmt::Display for Error{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Error::CanNotParseVoltage{line, err} => 
                write!(f, "'{}' is not a valid voltage: {}", line, err),
            Error::CanNotParseFrequency{line, err} => 
                write!(f, "'{}' is not a valid frequency: {}", line, err),
            Error::CanNotParseChargePercent{line, err} => 
                write!(f, "'{}' is not a valid battery charge percent: {}", line, err),
            Error::CanNotParseLoadPercent{line, err} => 
                write!(f, "'{}' is not a valid load percent: {}", line, err),
            Error::CanNotParseUPSMode{line} => 
                write!(f, "'{}' is not a valid UPS Mode", line),
            Error::CanNotParseMainsState{line} => 
                write!(f,"'{}' is not a valid mains state",line),
            Error::CanNotParseUPSConnectionStatus{line} => 
                write!(f,"'{}' is not a valid ups connection status", line),
            Error::CanNotParseTemperature{line, err} => 
                write!(f,"'{}' is not a valid temperature value: {}", line, err),
            Error::ChargePercentOutOfRange{charge_percent} => 
                write!(f,"Battery charge percent value {} is out of range", charge_percent),
            Error::UPSStateStringTooShort{ups_state} => 
                write!(f,"UPS state string is too short: {}", ups_state),
            Error::InternalError{description} => 
                write!(f,"Internal UPS state parser error: {}", description),
        }
    }
}

impl StdError for Error {
    fn source(&self) -> Option<&(dyn StdError + 'static)> {
        match *self {
            Error::CanNotParseVoltage{line: _, ref err} => Some(err),
            Error::CanNotParseFrequency{line: _, ref err} => Some(err),
            Error::CanNotParseChargePercent{line: _, ref err} => Some(err),
            Error::CanNotParseLoadPercent{line: _, ref err} => Some(err),
            Error::CanNotParseUPSMode{line: _} => None, 
            Error::CanNotParseMainsState{line: _} => None, 
            Error::CanNotParseUPSConnectionStatus{line: _} => None,
            Error::CanNotParseTemperature{line: _, ref err} => Some(err),
            Error::ChargePercentOutOfRange{charge_percent: _} => None,
            Error::UPSStateStringTooShort{ups_state: _} => None,
            Error::InternalError{description: _} => None
        }
    }
}