solverforge-cli 2.0.1

CLI for scaffolding and managing SolverForge constraint solver projects
// @generated by solverforge-cli: data v1

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)
}