use std::str::FromStr;
use crate::domain::{Container, Item, Plan};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DemoData {
Small,
Standard,
Large,
}
const AVAILABLE_DEMO_DATA: &[DemoData] = &[DemoData::Small, DemoData::Standard, DemoData::Large];
const DEFAULT_DEMO_DATA: DemoData = DemoData::Standard;
pub fn default_demo_data() -> DemoData {
DEFAULT_DEMO_DATA
}
pub fn available_demo_data() -> &'static [DemoData] {
AVAILABLE_DEMO_DATA
}
impl DemoData {
pub fn id(self) -> &'static str {
match self {
DemoData::Small => "SMALL",
DemoData::Standard => "STANDARD",
DemoData::Large => "LARGE",
}
}
pub fn default_demo_data() -> Self {
default_demo_data()
}
pub fn available_demo_data() -> &'static [Self] {
available_demo_data()
}
}
impl FromStr for DemoData {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_ascii_uppercase().as_str() {
"SMALL" => Ok(DemoData::Small),
"STANDARD" => Ok(DemoData::Standard),
"LARGE" => Ok(DemoData::Large),
_ => Err(()),
}
}
}
pub fn generate(demo: DemoData) -> Plan {
match demo {
DemoData::Small => generate_plan(3, 12),
DemoData::Standard => generate_plan(6, 36),
DemoData::Large => generate_plan(12, 108),
}
}
fn generate_plan(n_containers: usize, n_items: usize) -> Plan {
let containers: Vec<Container> = (0..n_containers)
.map(|i| {
let id = format!("container-{i}");
let name = format!("Container {}", (b'A' + i as u8) as char);
Container::new(id, name)
})
.collect();
let item_facts: Vec<Item> = (0..n_items)
.map(|i| Item::new(format!("item-{i}"), format!("Item {}", i + 1)))
.collect();
Plan::new(item_facts, containers)
}