use crate::command::Command;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EnergyCommand {
Get,
ResetToday,
ResetYesterday,
ResetTotal,
SetToday(u32),
SetTotal(u32),
}
impl EnergyCommand {
#[must_use]
pub const fn query() -> Self {
Self::Get
}
#[must_use]
pub const fn reset_today() -> Self {
Self::ResetToday
}
#[must_use]
pub const fn reset_total() -> Self {
Self::ResetTotal
}
}
impl Command for EnergyCommand {
fn name(&self) -> String {
match self {
Self::Get => "Status".to_string(),
Self::ResetToday | Self::SetToday(_) => "EnergyToday".to_string(),
Self::ResetYesterday => "EnergyYesterday".to_string(),
Self::ResetTotal | Self::SetTotal(_) => "EnergyTotal".to_string(),
}
}
fn payload(&self) -> Option<String> {
match self {
Self::Get => Some("10".to_string()),
Self::ResetToday | Self::ResetYesterday | Self::ResetTotal => Some("0".to_string()),
Self::SetToday(wh) | Self::SetTotal(wh) => Some(wh.to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn energy_command_get() {
let cmd = EnergyCommand::Get;
assert_eq!(cmd.name(), "Status");
assert_eq!(cmd.payload(), Some("10".to_string()));
}
#[test]
fn energy_command_reset() {
assert_eq!(EnergyCommand::ResetToday.name(), "EnergyToday");
assert_eq!(EnergyCommand::ResetToday.payload(), Some("0".to_string()));
assert_eq!(EnergyCommand::ResetYesterday.name(), "EnergyYesterday");
assert_eq!(
EnergyCommand::ResetYesterday.payload(),
Some("0".to_string())
);
assert_eq!(EnergyCommand::ResetTotal.name(), "EnergyTotal");
assert_eq!(EnergyCommand::ResetTotal.payload(), Some("0".to_string()));
}
#[test]
fn energy_command_set() {
let cmd = EnergyCommand::SetToday(1500);
assert_eq!(cmd.name(), "EnergyToday");
assert_eq!(cmd.payload(), Some("1500".to_string()));
let total = EnergyCommand::SetTotal(50000);
assert_eq!(total.name(), "EnergyTotal");
assert_eq!(total.payload(), Some("50000".to_string()));
}
}