use std::str::FromStr;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::protocol::errors::ParseError;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Units {
Seconds,
DeciSeconds,
CentiSeconds,
MilliSeconds,
MicroSeconds,
NanoSeconds,
Hertz,
MegaHertz,
KiloMetres,
DecaMetres,
Metres,
MetresPerSecond,
MetresPerSecondSquared,
FiveMetresPerSecond,
DeciMetres,
DeciMetresPerSecond,
CentiMetres,
SquareCentiMetres,
CentiMetresPerSecond,
MilliMetres,
MilliMetresPerSecond,
MilliMetresPerHour,
Kelvins,
DegreesCelsius,
CentiDegreeCelsius,
Radians,
RadiansPerSecond,
MilliRadiansPerSecond,
Degrees,
HalfDegrees,
DegreesPerSecond,
CentiDegrees,
CentiDegreesPerSecond,
DegreesE5,
DegreesE7,
RotationsPerMinute,
Volt,
CentiVolt,
MilliVolt,
Ampere,
AmpereHour,
CentiAmpere,
MilliAmpere,
MilliAmpereHour,
MilliTesla,
Gauss,
MilliGauss,
HectoJoule,
Watt,
MilliG,
Grams,
KiloGrams,
Pascal,
HectoPascal,
KiloPascal,
MilliBar,
Percent,
DeciPercent,
CentiPercent,
DeciBel,
DeciBelMilliWats,
KibiByte,
KibiBytePerSecond,
MebiByte,
MebiBytePerSecond,
Bytes,
BytesPerSecond,
BitsPerSecond,
Pixels,
DeciPixels,
GramsPerMinute,
CubicCentiMetresPerMinute,
CubicCentiMetres,
Litres,
}
impl FromStr for Units {
type Err = ParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Units::parse(s)
}
}
impl Units {
pub fn parse(s: &str) -> Result<Units, ParseError> {
let normalized = s.trim();
let known = match normalized {
"s" => Units::Seconds,
"ds" => Units::DeciSeconds,
"cs" => Units::CentiSeconds,
"ms" => Units::MilliSeconds,
"us" => Units::MicroSeconds,
"ns" => Units::NanoSeconds,
"Hz" => Units::Hertz,
"MHz" => Units::MegaHertz,
"km" => Units::KiloMetres,
"dam" => Units::DecaMetres,
"m" => Units::Metres,
"m/s" => Units::MetresPerSecond,
"m/s/s" => Units::MetresPerSecondSquared,
"m/s*5" => Units::FiveMetresPerSecond,
"dm" => Units::DeciMetres,
"dm/s" => Units::DeciMetresPerSecond,
"cm" => Units::CentiMetres,
"cm^2" => Units::SquareCentiMetres,
"cm/s" => Units::CentiMetresPerSecond,
"mm" => Units::MilliMetres,
"mm/s" => Units::MilliMetresPerSecond,
"mm/h" => Units::MilliMetresPerHour,
"K" => Units::Kelvins,
"degC" => Units::DegreesCelsius,
"cdegC" => Units::CentiDegreeCelsius,
"rad" => Units::Radians,
"rad/s" => Units::RadiansPerSecond,
"mrad/s" => Units::MilliRadiansPerSecond,
"deg" => Units::Degrees,
"deg/2" => Units::HalfDegrees,
"deg/s" => Units::DegreesPerSecond,
"cdeg" => Units::CentiDegrees,
"cdeg/s" => Units::CentiDegreesPerSecond,
"degE5" => Units::DegreesE5,
"degE7" => Units::DegreesE7,
"rpm" => Units::RotationsPerMinute,
"V" => Units::Volt,
"cV" => Units::CentiVolt,
"mV" => Units::MilliVolt,
"A" => Units::Ampere,
"Ah" => Units::AmpereHour,
"cA" => Units::CentiAmpere,
"mA" => Units::MilliAmpere,
"mAh" => Units::MilliAmpereHour,
"mT" => Units::MilliTesla,
"gauss" => Units::Gauss,
"mgauss" => Units::MilliGauss,
"hJ" => Units::HectoJoule,
"W" => Units::Watt,
"mG" => Units::MilliG,
"g" => Units::Grams,
"kg" => Units::KiloGrams,
"Pa" => Units::Pascal,
"hPa" => Units::HectoPascal,
"kPa" => Units::KiloPascal,
"mbar" => Units::MilliBar,
"%" => Units::Percent,
"d%" => Units::DeciPercent,
"c%" => Units::CentiPercent,
"dB" => Units::DeciBel,
"dBm" => Units::DeciBelMilliWats,
"KiB" => Units::KibiByte,
"KiB/s" => Units::KibiBytePerSecond,
"MiB" => Units::MebiByte,
"MiB/s" => Units::MebiBytePerSecond,
"bytes" => Units::Bytes,
"bytes/s" => Units::BytesPerSecond,
"bits/s" => Units::BitsPerSecond,
"pix" => Units::Pixels,
"dpix" => Units::DeciPixels,
"g/min" => Units::GramsPerMinute,
"cm^3/min" => Units::CubicCentiMetresPerMinute,
"cm^3" => Units::CubicCentiMetres,
"l" => Units::Litres,
unknown => return Err(ParseError::UnitsError(unknown.to_string())),
};
Ok(known)
}
}