1use serde::Deserialize;
2
3#[allow(clippy::enum_variant_names)]
4#[derive(Clone, Debug, Deserialize)]
5pub enum DiscontentmentKind {
6 GreaterThanOrEqualTo,
7 LessThanOrEqualTo,
8 EqualTo,
9}
10
11#[derive(Clone, Debug, Deserialize)]
12pub struct Goal {
13 weight: f32, target: i32, pub kind: DiscontentmentKind,
16}
17
18impl Goal {
19 pub fn discontentment(&self, current_value: i32) -> f32 {
20 let delta = match self.kind {
21 DiscontentmentKind::GreaterThanOrEqualTo => (self.target - current_value).max(0),
22 DiscontentmentKind::LessThanOrEqualTo => (current_value - self.target).max(0),
23 DiscontentmentKind::EqualTo => (self.target - current_value).abs(),
24 };
25
26 self.weight * delta as f32
27 }
28}