use std::path::PathBuf;
use crate::model::ItemType;
#[derive(Debug, Clone)]
pub struct InitOptions {
pub file: PathBuf,
pub id: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub force: bool,
pub type_config: TypeConfig,
}
#[derive(Debug, Clone)]
pub enum TypeConfig {
Solution,
UseCase {
refines: Vec<String>,
},
Scenario {
refines: Vec<String>,
},
SystemRequirement {
specification: Option<String>,
derives_from: Vec<String>,
depends_on: Vec<String>,
},
SystemArchitecture {
platform: Option<String>,
satisfies: Vec<String>,
},
SoftwareRequirement {
specification: Option<String>,
derives_from: Vec<String>,
depends_on: Vec<String>,
},
HardwareRequirement {
specification: Option<String>,
derives_from: Vec<String>,
depends_on: Vec<String>,
},
SoftwareDetailedDesign {
satisfies: Vec<String>,
},
HardwareDetailedDesign {
satisfies: Vec<String>,
},
Adr {
status: Option<String>,
deciders: Vec<String>,
justifies: Vec<String>,
supersedes: Vec<String>,
superseded_by: Option<String>,
},
}
impl TypeConfig {
pub fn item_type(&self) -> ItemType {
match self {
TypeConfig::Solution => ItemType::Solution,
TypeConfig::UseCase { .. } => ItemType::UseCase,
TypeConfig::Scenario { .. } => ItemType::Scenario,
TypeConfig::SystemRequirement { .. } => ItemType::SystemRequirement,
TypeConfig::SystemArchitecture { .. } => ItemType::SystemArchitecture,
TypeConfig::SoftwareRequirement { .. } => ItemType::SoftwareRequirement,
TypeConfig::HardwareRequirement { .. } => ItemType::HardwareRequirement,
TypeConfig::SoftwareDetailedDesign { .. } => ItemType::SoftwareDetailedDesign,
TypeConfig::HardwareDetailedDesign { .. } => ItemType::HardwareDetailedDesign,
TypeConfig::Adr { .. } => ItemType::ArchitectureDecisionRecord,
}
}
pub fn solution() -> Self {
TypeConfig::Solution
}
pub fn use_case() -> Self {
TypeConfig::UseCase {
refines: Vec::new(),
}
}
pub fn scenario() -> Self {
TypeConfig::Scenario {
refines: Vec::new(),
}
}
pub fn system_requirement() -> Self {
TypeConfig::SystemRequirement {
specification: None,
derives_from: Vec::new(),
depends_on: Vec::new(),
}
}
pub fn system_architecture() -> Self {
TypeConfig::SystemArchitecture {
platform: None,
satisfies: Vec::new(),
}
}
pub fn software_requirement() -> Self {
TypeConfig::SoftwareRequirement {
specification: None,
derives_from: Vec::new(),
depends_on: Vec::new(),
}
}
pub fn hardware_requirement() -> Self {
TypeConfig::HardwareRequirement {
specification: None,
derives_from: Vec::new(),
depends_on: Vec::new(),
}
}
pub fn software_detailed_design() -> Self {
TypeConfig::SoftwareDetailedDesign {
satisfies: Vec::new(),
}
}
pub fn hardware_detailed_design() -> Self {
TypeConfig::HardwareDetailedDesign {
satisfies: Vec::new(),
}
}
pub fn adr() -> Self {
TypeConfig::Adr {
status: None,
deciders: Vec::new(),
justifies: Vec::new(),
supersedes: Vec::new(),
superseded_by: None,
}
}
pub fn from_item_type(item_type: ItemType) -> Self {
match item_type {
ItemType::Solution => TypeConfig::solution(),
ItemType::UseCase => TypeConfig::use_case(),
ItemType::Scenario => TypeConfig::scenario(),
ItemType::SystemRequirement => TypeConfig::system_requirement(),
ItemType::SystemArchitecture => TypeConfig::system_architecture(),
ItemType::SoftwareRequirement => TypeConfig::software_requirement(),
ItemType::HardwareRequirement => TypeConfig::hardware_requirement(),
ItemType::SoftwareDetailedDesign => TypeConfig::software_detailed_design(),
ItemType::HardwareDetailedDesign => TypeConfig::hardware_detailed_design(),
ItemType::ArchitectureDecisionRecord => TypeConfig::adr(),
}
}
}
impl InitOptions {
pub fn new(file: PathBuf, type_config: TypeConfig) -> Self {
Self {
file,
id: None,
name: None,
description: None,
force: false,
type_config,
}
}
pub fn item_type(&self) -> ItemType {
self.type_config.item_type()
}
pub fn with_id(mut self, id: impl Into<String>) -> Self {
self.id = Some(id.into());
self
}
pub fn maybe_id(mut self, id: Option<String>) -> Self {
self.id = id;
self
}
pub fn with_name(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
pub fn maybe_name(mut self, name: Option<String>) -> Self {
self.name = name;
self
}
pub fn with_description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
pub fn maybe_description(mut self, description: Option<String>) -> Self {
self.description = description;
self
}
pub fn with_force(mut self, force: bool) -> Self {
self.force = force;
self
}
}