1use std::fmt;
2
3use rust_decimal::Decimal;
4
5use crate::{impl_dec_newtype, json, money::Cost, number, Money};
6
7impl_dec_newtype!(Ampere);
8impl_dec_newtype!(Kwh);
9impl_dec_newtype!(Kw);
10
11#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Default)]
13pub struct Kwh(Decimal);
14
15impl Cost for Kwh {
16 fn cost(&self, money: Money) -> Money {
17 let cost = self.0.saturating_mul(money.into());
18 Money::from_decimal(cost)
19 }
20}
21
22impl Kwh {
23 pub fn watt_hours(self) -> Decimal {
24 self.0.saturating_mul(Decimal::from(1000))
25 }
26
27 #[expect(clippy::missing_panics_doc, reason = "divisor is non-zero")]
28 #[expect(clippy::unwrap_used, reason = "divisor is non-zero")]
29 pub fn from_watt_hours(num: Decimal) -> Self {
30 Self(num.checked_div(Decimal::from(1000)).unwrap())
31 }
32}
33
34#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord)]
36pub struct Kw(Decimal);
37
38#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord)]
40pub struct Ampere(Decimal);