ocpi_tariffs/
energy.rs

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/// A value of kilo watt hours.
12#[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/// A value of kilo watts.
35#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord)]
36pub struct Kw(Decimal);
37
38/// A value of amperes.
39#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord)]
40pub struct Ampere(Decimal);