checkout_controller 0.0.7

a set of interfaces to create robust backends for a pleasant checkout experience
use crate::{item::Item, CheckoutError};
use async_trait::async_trait;
use chrono::{DateTime, Duration, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct StockIssue {
    sku: String,
    max_available: u64,
}

pub enum ReserveResult {
    Success(DateTime<Utc>),
    StockIssue(Vec<StockIssue>),
}

#[async_trait]
pub trait InventoryController {
    async fn reserve_items(&mut self, _items: &Vec<Item>) -> Result<ReserveResult, CheckoutError> {
        let deadline = Utc::now() + Duration::days(1);
        Ok(ReserveResult::Success(deadline))
    }

    async fn free_items(&mut self, _items: &Vec<Item>) -> Result<(), CheckoutError> {
        Ok(())
    }
}