worldline/
create_order.rs

1use 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 = &currency.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}