use serde::{Deserialize, Serialize};
use crate::model::{Criticality, Domain, Level};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Scope {
Localized,
CrossCutting,
Structural,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ResponseClass {
ReArchitecture,
Restructure,
MinorFix,
}
pub fn response_class(
criticality: Option<Criticality>,
domain: Domain,
scope: Option<Scope>,
) -> Option<ResponseClass> {
let criticality = criticality?;
Some(match criticality {
Level::High => {
if domain == Domain::Architecture || scope == Some(Scope::Structural) {
ResponseClass::ReArchitecture
} else {
ResponseClass::Restructure
}
}
Level::Medium => ResponseClass::Restructure,
Level::Low => ResponseClass::MinorFix,
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::model::Domain::{Architecture, Delivery, Runtime, Ux};
use crate::model::Level::{High, Low, Medium};
#[test]
fn unscored_has_no_response_class() {
assert_eq!(response_class(None, Runtime, None), None);
assert_eq!(
response_class(None, Architecture, Some(Scope::Structural)),
None
);
}
#[test]
fn high_architecture_is_re_architecture() {
assert_eq!(
response_class(Some(High), Architecture, None),
Some(ResponseClass::ReArchitecture)
);
}
#[test]
fn high_runtime_or_delivery_is_restructure() {
assert_eq!(
response_class(Some(High), Runtime, None),
Some(ResponseClass::Restructure)
);
assert_eq!(
response_class(Some(High), Delivery, None),
Some(ResponseClass::Restructure)
);
assert_eq!(
response_class(Some(High), Ux, None),
Some(ResponseClass::Restructure)
);
}
#[test]
fn structural_scope_promotes_high_to_re_architecture() {
assert_eq!(
response_class(Some(High), Runtime, Some(Scope::Structural)),
Some(ResponseClass::ReArchitecture)
);
}
#[test]
fn medium_is_restructure_regardless_of_domain_or_scope() {
for d in [Ux, Runtime, Architecture, Delivery] {
assert_eq!(
response_class(Some(Medium), d, None),
Some(ResponseClass::Restructure)
);
}
assert_eq!(
response_class(Some(Medium), Runtime, Some(Scope::Localized)),
Some(ResponseClass::Restructure)
);
}
#[test]
fn low_is_minor_fix() {
assert_eq!(
response_class(Some(Low), Architecture, None),
Some(ResponseClass::MinorFix)
);
assert_eq!(
response_class(Some(Low), Runtime, Some(Scope::CrossCutting)),
Some(ResponseClass::MinorFix)
);
}
}