checkout_controller 0.0.7

a set of interfaces to create robust backends for a pleasant checkout experience
use crate::address::Address;
use crate::inventory::InventoryController;
use crate::invoice::InvoiceCalculator;
use crate::item::{Item, ItemTitleResolver};
use crate::money::Currency;
use crate::price::PriceCalculator;
use crate::shipping::{ShippingCalculator, ShippingQuote};
use crate::{CheckoutContext, CheckoutContextProvider, CheckoutError};
use async_trait::async_trait;

pub struct DummyContext {}

impl DummyContext {
    pub fn new() -> Self {
        Self {}
    }
}

#[async_trait]
impl ItemTitleResolver for DummyContext {
    async fn resolve_item_title(&mut self, sku: &str) -> Result<String, CheckoutError> {
        Ok(sku.to_string())
    }
}

#[async_trait]
impl PriceCalculator for DummyContext {
    async fn update_item_prices(
        &mut self,
        _currency: &Currency,
        _promo_codes: &Vec<String>,
        _items: &mut Vec<Item>,
    ) -> Result<(), CheckoutError> {
        Ok(())
    }
}

#[async_trait]
impl ShippingCalculator for DummyContext {
    async fn get_shipping_quotes(
        &mut self,
        _currency: &Currency,
        _promo_codes: &Vec<String>,
        _items: &Vec<Item>,
        _address: &Address,
    ) -> Result<Vec<ShippingQuote>, CheckoutError> {
        Ok(vec![])
    }
}

impl InventoryController for DummyContext {}
impl InvoiceCalculator for DummyContext {}
impl CheckoutContext for DummyContext {}

pub struct DummyContextProvider {}

#[async_trait]
impl CheckoutContextProvider for DummyContextProvider {
    type Context = DummyContext;

    async fn new_context(&self) -> Result<Self::Context, CheckoutError> {
        Ok(DummyContext::new())
    }
}