worldline/
create_order.rs1use crate::{
2 currency::Currency, error::Error, order, order::Order, payment_method::PaymentMethod, Gateway,
3};
4use serde::Serialize;
5
6impl Gateway {
7 pub async fn create_order<'a>(
8 &self,
9 order_id: &'a str,
10 url: &'a Option<&order::Url<'a>>,
11 amount: u64,
12 vat_amount: u64,
13 currency: &'a Currency,
14 language: &'a str,
15 payment_methods: Vec<&'a PaymentMethod>,
16 token: &'a Option<order::Token>,
17 ) -> Result<Order, Error> {
18 #[derive(Serialize)]
19 struct Request<'a> {
20 order: OrderRequest<'a>,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
23 url: &'a Option<&'a order::Url<'a>>,
24
25 paymentwindow: PaymentWindow<'a>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
28 token: &'a Option<order::Token>,
29 }
30
31 #[derive(Serialize)]
32 struct OrderRequest<'a> {
33 amount: u64,
34
35 id: &'a str,
36
37 #[serde(rename = "vatamount")]
38 vat_amount: u64,
39
40 currency: &'a str,
41 }
42
43 #[derive(Serialize)]
44 struct PaymentMethodObject<'a> {
45 id: &'a PaymentMethod,
46
47 action: &'a str,
48 }
49
50 #[derive(Serialize)]
51 struct PaymentWindow<'a> {
52 language: &'a str,
53
54 #[serde(rename = "paymentmethods")]
55 payment_methods: Vec<PaymentMethodObject<'a>>,
56 }
57
58 let currency = ¤cy.to_string();
59
60 let body = Request {
61 order: OrderRequest {
62 amount,
63 id: order_id,
64 vat_amount,
65 currency,
66 },
67 url,
68 paymentwindow: PaymentWindow {
69 language,
70 payment_methods: payment_methods
71 .into_iter()
72 .map(|p| PaymentMethodObject {
73 id: p,
74 action: "include",
75 })
76 .collect::<Vec<PaymentMethodObject>>(),
77 },
78 token,
79 };
80
81 let url = "https://api.v1.checkout.bambora.com/sessions";
82 let res: Order = self.send(url, &body).await?;
83 Ok(res)
84 }
85}