paystack/endpoints/
subaccount.rs1use super::PAYSTACK_BASE_URL;
7use crate::{
8 CreateSubaccountRequest, HttpClient, PaystackAPIError, PaystackResult, Response,
9 SubaccountsResponseData,
10};
11use std::sync::Arc;
12
13#[derive(Debug, Clone)]
15pub struct SubaccountEndpoints<T: HttpClient + Default> {
16 key: String,
18 base_url: String,
20 http: Arc<T>,
22}
23
24impl<T: HttpClient + Default> SubaccountEndpoints<T> {
25 pub fn new(key: Arc<String>, http: Arc<T>) -> SubaccountEndpoints<T> {
34 let base_url = format!("{PAYSTACK_BASE_URL}/subaccount");
35 SubaccountEndpoints {
36 key: key.to_string(),
37 base_url,
38 http,
39 }
40 }
41
42 pub async fn create_subaccount(
51 &self,
52 subaccount_request: CreateSubaccountRequest,
53 ) -> PaystackResult<SubaccountsResponseData> {
54 let url = &self.base_url;
55 let body = serde_json::to_value(subaccount_request)
56 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
57
58 let response = self
59 .http
60 .post(url, &self.key, &body)
61 .await
62 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
63
64 let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
65 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
66 Ok(parsed_response)
67 }
68
69 pub async fn list_subaccounts(
78 &self,
79 per_page: Option<u32>,
80 page: Option<u32>,
81 ) -> PaystackResult<Vec<SubaccountsResponseData>> {
82 let url = self.base_url.to_string();
83
84 let per_page = per_page.unwrap_or(50).to_string();
85 let page = page.unwrap_or(1).to_string();
86 let query = vec![("perPage", per_page.as_str()), ("page", page.as_str())];
87
88 let response = self
89 .http
90 .get(&url, &self.key, Some(&query))
91 .await
92 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
93
94 let parsed_response: Response<Vec<SubaccountsResponseData>> =
95 serde_json::from_str(&response)
96 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
97
98 Ok(parsed_response)
99 }
100
101 pub async fn fetch_subaccount(
109 &self,
110 id_or_code: String,
111 ) -> PaystackResult<SubaccountsResponseData> {
112 let url = format!("{}/{}", self.base_url, id_or_code);
113
114 let response = self
115 .http
116 .get(&url, &self.key, None)
117 .await
118 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
119
120 let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
121 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
122
123 Ok(parsed_response)
124 }
125
126 pub async fn update_subaccount(
136 &self,
137 id_or_code: String,
138 update_request: CreateSubaccountRequest,
139 ) -> PaystackResult<SubaccountsResponseData> {
140 let url = format!("{}/{}", self.base_url, id_or_code);
141 let body = serde_json::to_value(update_request)
142 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
143
144 let response = self
145 .http
146 .put(&url, &self.key, &body)
147 .await
148 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
149
150 let parsed_response: Response<SubaccountsResponseData> = serde_json::from_str(&response)
151 .map_err(|e| PaystackAPIError::Subaccount(e.to_string()))?;
152
153 Ok(parsed_response)
154 }
155}