1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//! Subaccounts
//! ===========
//! The Subaccounts API allows you to create and manage subaccounts on your integration.
//! Subaccounts can be used to split payment between two accounts (your main account and a subaccount).
use super::PAYSTACK_BASE_URL;
use crate::{
CreateSubaccountRequest, HttpClient, PaystackAPIError, PaystackResult, Response,
SubaccountsResponseData,
};
use std::sync::Arc;
/// A struct to hold all functions in the subaccount API route
#[derive(Debug, Clone)]
pub struct SubaccountEndpoints<T: HttpClient + Default> {
/// Paystack API Key
key: String,
/// Base URL for the subaccount route
base_url: String,
/// Http client for the route
http: Arc<T>,
}
impl<T: HttpClient + Default> SubaccountEndpoints<T> {
/// Creates a new SubaccountEndpoints instance
///
/// # Arguments
/// * `key` - The Paystack API key
/// * `http` - The HTTP client implementation to use for API requests
///
/// # Returns
/// A new SubaccountEndpoints instance
pub fn new(key: Arc<String>, http: Arc<T>) -> SubaccountEndpoints<T> {
let base_url = format!("{PAYSTACK_BASE_URL}/subaccount");
SubaccountEndpoints {
key: key.to_string(),
base_url,
http,
}
}
/// Create a subaccount on your integration
///
/// # Arguments
/// * `subaccount_request` - The request data to create the subaccount.
/// It should be created with the `CreateSubaccountRequestBuilder` struct.
///
/// # Returns
/// A Result containing the subaccount response data or an error
pub async fn create_subaccount(
&self,
subaccount_request: CreateSubaccountRequest,
) -> PaystackResult<SubaccountsResponseData> {
let url = &self.base_url;
let body = serde_json::to_value(subaccount_request)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let response = self
.http
.post(url, &self.key, &body)
.await
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
Ok(parsed_response)
}
/// List subaccounts available on your integration.
///
/// # Arguments
/// * `per_page` - Optional number of subaccounts to return per page. Defaults to 50 if None.
/// * `page` - Specify exactly what page you want to retrieve. Defaults to 1 if None.
///
/// # Returns
/// A Result containing a vector of subaccount data or an error.
pub async fn list_subaccounts(
&self,
per_page: Option<u32>,
page: Option<u32>,
) -> PaystackResult<Vec<SubaccountsResponseData>> {
let url = self.base_url.to_string();
let per_page = per_page.unwrap_or(50).to_string();
let page = page.unwrap_or(1).to_string();
let query = vec![("perPage", per_page.as_str()), ("page", page.as_str())];
let response = self
.http
.get(&url, &self.key, Some(&query))
.await
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let parsed_response: Response<Vec<SubaccountsResponseData>> =
serde_json::from_str(&response)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
Ok(parsed_response)
}
/// Get the details of a subaccount on your integration
///
/// # Arguments
/// * `id_or_code` - The subaccount ID or code you want to fetch
///
/// # Returns
/// A Result containing the details of the subaccount or an error.
pub async fn fetch_subaccount(
&self,
id_or_code: String,
) -> PaystackResult<SubaccountsResponseData> {
let url = format!("{}/{}", self.base_url, id_or_code);
let response = self
.http
.get(&url, &self.key, None)
.await
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
Ok(parsed_response)
}
/// Update a subaccount details in your integration
///
/// # Arguments
/// * `id_or_code` - Subaccount's ID or code
/// * `update_request` - The request data to update the subaccount.
/// It should be created with the `CreateSubaccountRequestBuilder` struct.
///
/// # Returns
/// A Result containing the updated subaccount response data or an error
pub async fn update_subaccount(
&self,
id_or_code: String,
update_request: CreateSubaccountRequest,
) -> PaystackResult<SubaccountsResponseData> {
let url = format!("{}/{}", self.base_url, id_or_code);
let body = serde_json::to_value(update_request)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let response = self
.http
.put(&url, &self.key, &body)
.await
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
.map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
Ok(parsed_response)
}
}