use serde::{Deserialize, Serialize};
use crate::domain::sector::enums::{CarbonFootprintClass, LifecycleStage, SystemBoundary};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CarbonFootprint {
pub value_kg: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_stage: Option<LifecycleStage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_boundary: Option<SystemBoundary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub methodology_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub performance_class: Option<CarbonFootprintClass>,
}
impl CarbonFootprint {
pub fn from_kg(value_kg: f64) -> Self {
Self {
value_kg,
lifecycle_stage: None,
system_boundary: None,
methodology_ref: None,
performance_class: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RepairCriterion {
pub name: String,
pub score: f64,
pub weight: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RepairabilityScore {
pub overall: f64,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub criteria: Vec<RepairCriterion>,
}
impl RepairabilityScore {
pub fn from_scalar(overall: f64) -> Self {
Self {
overall,
criteria: Vec::new(),
}
}
}