use std::fmt::{Display, Formatter};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EffortRequest {
pub model: EffortModelKind,
pub layer: EffortLayer,
pub base_ref: Option<String>,
pub head_ref: Option<String>,
pub monte_carlo: bool,
pub mc_iterations: usize,
pub mc_seed: Option<u64>,
}
impl Default for EffortRequest {
fn default() -> Self {
Self {
model: EffortModelKind::Cocomo81Basic,
layer: EffortLayer::Full,
base_ref: None,
head_ref: None,
monte_carlo: false,
mc_iterations: 10_000,
mc_seed: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EffortModelKind {
Cocomo81Basic,
Cocomo2Early,
Ensemble,
}
impl EffortModelKind {
pub fn as_str(self) -> &'static str {
match self {
Self::Cocomo81Basic => "cocomo81-basic",
Self::Cocomo2Early => "cocomo2-early",
Self::Ensemble => "ensemble",
}
}
}
impl Display for EffortModelKind {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EffortLayer {
Headline,
Why,
Full,
}
impl EffortLayer {
pub fn as_str(self) -> &'static str {
match self {
Self::Headline => "headline",
Self::Why => "why",
Self::Full => "full",
}
}
}
impl Display for EffortLayer {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn effort_request_default_pins_engine_baseline() {
let req = EffortRequest::default();
assert_eq!(req.model, EffortModelKind::Cocomo81Basic);
assert_eq!(req.layer, EffortLayer::Full);
assert!(req.base_ref.is_none());
assert!(req.head_ref.is_none());
assert!(!req.monte_carlo);
assert_eq!(req.mc_iterations, 10_000);
assert!(req.mc_seed.is_none());
}
#[test]
fn effort_model_kind_string_forms_are_stable() {
for (kind, expected) in [
(EffortModelKind::Cocomo81Basic, "cocomo81-basic"),
(EffortModelKind::Cocomo2Early, "cocomo2-early"),
(EffortModelKind::Ensemble, "ensemble"),
] {
assert_eq!(kind.as_str(), expected);
assert_eq!(kind.to_string(), expected);
}
}
#[test]
fn effort_layer_string_forms_are_stable() {
for (layer, expected) in [
(EffortLayer::Headline, "headline"),
(EffortLayer::Why, "why"),
(EffortLayer::Full, "full"),
] {
assert_eq!(layer.as_str(), expected);
assert_eq!(layer.to_string(), expected);
}
}
}