use crate::error::CalcError;
use crate::factor::FactorProvider;
use crate::receipt::CalculationReceipt;
use crate::ruleset::Ruleset;
use serde::{Deserialize, Serialize};
pub trait CfbRuleset: Ruleset {
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CfbInputs {
pub model_id: String,
pub battery_chemistry: String,
pub nominal_capacity_kwh: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CfbResult {
pub cfb_kg_co2e_per_kwh: f64,
pub cfb_kg_co2e_total: f64,
pub receipt: CalculationReceipt,
}
pub fn calculate_cfb(
_inputs: &CfbInputs,
_provider: &dyn FactorProvider,
) -> Result<CfbResult, CalcError> {
Err(CalcError::NotImplemented {
methodology: "battery-cfb".into(),
reason: "gate: signed ecoinvent/EF sublicense + legal warranty + confirmed \
CFB Delegated Act number (EU 2025/…)"
.into(),
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::factor::SyntheticFactorProvider;
#[test]
fn calculate_cfb_returns_not_implemented() {
let inputs = CfbInputs {
model_id: "test-battery".into(),
battery_chemistry: "NMC".into(),
nominal_capacity_kwh: 60.0,
};
let provider = SyntheticFactorProvider::new(std::iter::empty::<(String, f64)>());
let err = calculate_cfb(&inputs, &provider).unwrap_err();
assert!(
matches!(err, CalcError::NotImplemented { .. }),
"expected NotImplemented, got {err}"
);
}
}