1use crate::{
5    ApplePayEndpoints, CustomersEndpoints, DedicatedVirtualAccountEndpoints, HttpClient,
6    PlansEndpoints, SubaccountEndpoints, TerminalEndpoints, TransactionEndpoints,
7    TransactionSplitEndpoints, VirtualTerminalEndpoints,
8};
9use std::sync::Arc;
10
11pub struct PaystackClient<T: HttpClient + Default> {
14    pub transactions: TransactionEndpoints<T>,
16    pub transaction_split: TransactionSplitEndpoints<T>,
18    pub subaccount: SubaccountEndpoints<T>,
20    pub terminal: TerminalEndpoints<T>,
22    pub virutal_terminal: VirtualTerminalEndpoints<T>,
24    pub customers: CustomersEndpoints<T>,
26    pub dedicated_virtual_account: DedicatedVirtualAccountEndpoints<T>,
28    pub apple_pay: ApplePayEndpoints<T>,
30    pub plans: PlansEndpoints<T>,
32}
33
34impl<T: HttpClient + Default> PaystackClient<T> {
35    pub fn new(api_key: String) -> PaystackClient<T> {
36        let http = Arc::new(T::default());
37        let key = Arc::new(api_key);
38        PaystackClient {
39            transactions: TransactionEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
40            transaction_split: TransactionSplitEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
41            subaccount: SubaccountEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
42            terminal: TerminalEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
43            virutal_terminal: VirtualTerminalEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
44            customers: CustomersEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
45            dedicated_virtual_account: DedicatedVirtualAccountEndpoints::new(
46                Arc::clone(&key),
47                Arc::clone(&http),
48            ),
49            apple_pay: ApplePayEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
50            plans: PlansEndpoints::new(Arc::clone(&key), Arc::clone(&http)),
51        }
52    }
53}