use crate::{
currency::Currency, error::Error, order, order::Order, payment_method::PaymentMethod, Gateway,
};
use serde::Serialize;
impl Gateway {
pub async fn create_order<'a>(
&self,
order_id: &'a str,
url: &'a Option<&order::Url<'a>>,
amount: u64,
vat_amount: u64,
currency: &'a Currency,
language: &'a str,
payment_methods: Vec<&'a PaymentMethod>,
token: &'a Option<order::Token>,
) -> Result<Order, Error> {
#[derive(Serialize)]
struct Request<'a> {
order: OrderRequest<'a>,
#[serde(skip_serializing_if = "Option::is_none")]
url: &'a Option<&'a order::Url<'a>>,
paymentwindow: PaymentWindow<'a>,
#[serde(skip_serializing_if = "Option::is_none")]
token: &'a Option<order::Token>,
}
#[derive(Serialize)]
struct OrderRequest<'a> {
amount: u64,
id: &'a str,
#[serde(rename = "vatamount")]
vat_amount: u64,
currency: &'a str,
}
#[derive(Serialize)]
struct PaymentMethodObject<'a> {
id: &'a PaymentMethod,
action: &'a str,
}
#[derive(Serialize)]
struct PaymentWindow<'a> {
language: &'a str,
#[serde(rename = "paymentmethods")]
payment_methods: Vec<PaymentMethodObject<'a>>,
}
let currency = ¤cy.to_string();
let body = Request {
order: OrderRequest {
amount,
id: order_id,
vat_amount,
currency,
},
url,
paymentwindow: PaymentWindow {
language,
payment_methods: payment_methods
.into_iter()
.map(|p| PaymentMethodObject {
id: p,
action: "include",
})
.collect::<Vec<PaymentMethodObject>>(),
},
token,
};
let url = "https://api.v1.checkout.bambora.com/sessions";
let res: Order = self.send(url, &body).await?;
Ok(res)
}
}