1use crate::client::{AuthenticatedOpenPaymentsClient, BaseClient};
2use crate::types::{
3 AccessTokenResponse, ContinueResponse, GrantRequest, GrantResponse, IncomingPayment,
4 IncomingPaymentRequest, JsonWebKey, JsonWebKeySet, ListIncomingPaymentsResponse,
5 ListOutgoingPaymentsResponse, OutgoingPayment, OutgoingPaymentGrantSpentAmounts,
6 OutgoingPaymentRequest, PublicIncomingPayment, Quote, QuoteRequest, WalletAddress,
7};
8use crate::{
9 grant::{cancel_grant, continue_grant, request_grant},
10 payments::{
11 complete_incoming_payment, create_incoming_payment, create_outgoing_payment,
12 get_grant_spent_amounts, get_incoming_payment, get_outgoing_payment,
13 get_public_incoming_payment, list_incoming_payments, list_outgoing_payments,
14 },
15 quotes::{create_quote, get_quote},
16 token::{revoke_access_token, rotate_access_token},
17 wallet_address::{get_keys, get_wallet_address},
18 Result,
19};
20pub mod authenticated {
21 use super::*;
22
23 pub struct QuoteResource<'a> {
24 client: &'a AuthenticatedOpenPaymentsClient,
25 }
26
27 impl<'a> QuoteResource<'a> {
28 pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
29 Self { client }
30 }
31
32 pub async fn create(
33 &self,
34 resource_server_url: &str,
35 req_body: &QuoteRequest,
36 access_token: Option<&str>,
37 ) -> Result<Quote> {
38 create_quote(self.client, resource_server_url, req_body, access_token).await
39 }
40
41 pub async fn get(&self, quote_url: &str, access_token: Option<&str>) -> Result<Quote> {
42 get_quote(self.client, quote_url, access_token).await
43 }
44 }
45 pub struct IncomingPaymentResource<'a> {
46 client: &'a AuthenticatedOpenPaymentsClient,
47 }
48
49 impl<'a> IncomingPaymentResource<'a> {
50 pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
51 Self { client }
52 }
53
54 pub async fn create(
55 &self,
56 resource_server_url: &str,
57 req_body: &IncomingPaymentRequest,
58 access_token: Option<&str>,
59 ) -> Result<IncomingPayment> {
60 create_incoming_payment(self.client, resource_server_url, req_body, access_token).await
61 }
62
63 pub async fn get(
64 &self,
65 payment_url: &str,
66 access_token: Option<&str>,
67 ) -> Result<IncomingPayment> {
68 get_incoming_payment(self.client, payment_url, access_token).await
69 }
70
71 pub async fn complete(
72 &self,
73 payment_url: &str,
74 access_token: Option<&str>,
75 ) -> Result<IncomingPayment> {
76 complete_incoming_payment(self.client, payment_url, access_token).await
77 }
78
79 pub async fn list(
80 &self,
81 resource_server_url: &str,
82 wallet_address: &str,
83 cursor: Option<&str>,
84 first: Option<u32>,
85 last: Option<u32>,
86 access_token: Option<&str>,
87 ) -> Result<ListIncomingPaymentsResponse> {
88 list_incoming_payments(
89 self.client,
90 resource_server_url,
91 wallet_address,
92 cursor,
93 first,
94 last,
95 access_token,
96 )
97 .await
98 }
99 }
100
101 pub struct OutgoingPaymentResource<'a> {
102 client: &'a AuthenticatedOpenPaymentsClient,
103 }
104
105 impl<'a> OutgoingPaymentResource<'a> {
106 pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
107 Self { client }
108 }
109
110 pub async fn create(
111 &self,
112 resource_server_url: &str,
113 req_body: &OutgoingPaymentRequest,
114 access_token: Option<&str>,
115 ) -> Result<OutgoingPayment> {
116 create_outgoing_payment(self.client, resource_server_url, req_body, access_token).await
117 }
118
119 pub async fn list(
120 &self,
121 resource_server_url: &str,
122 wallet_address: &str,
123 cursor: Option<&str>,
124 first: Option<u32>,
125 last: Option<u32>,
126 access_token: Option<&str>,
127 ) -> Result<ListOutgoingPaymentsResponse> {
128 list_outgoing_payments(
129 self.client,
130 resource_server_url,
131 wallet_address,
132 cursor,
133 first,
134 last,
135 access_token,
136 )
137 .await
138 }
139
140 pub async fn get(
141 &self,
142 payment_url: &str,
143 access_token: Option<&str>,
144 ) -> Result<OutgoingPayment> {
145 get_outgoing_payment(self.client, payment_url, access_token).await
146 }
147
148 pub async fn get_grant_spent_amounts(
152 &self,
153 resource_server_url: &str,
154 access_token: Option<&str>,
155 ) -> Result<OutgoingPaymentGrantSpentAmounts> {
156 get_grant_spent_amounts(self.client, resource_server_url, access_token).await
157 }
158 }
159
160 pub struct Grant<'a> {
161 client: &'a AuthenticatedOpenPaymentsClient,
162 }
163
164 impl<'a> Grant<'a> {
165 pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
166 Self { client }
167 }
168
169 pub async fn request(
175 &self,
176 auth_url: &str,
177 grant: &GrantRequest,
178 client_override: Option<&JsonWebKey>,
179 ) -> Result<GrantResponse> {
180 request_grant(self.client, auth_url, grant, client_override).await
181 }
182
183 pub async fn continue_grant(
184 &self,
185 continue_uri: &str,
186 interact_ref: &str,
187 access_token: Option<&str>,
188 ) -> Result<ContinueResponse> {
189 continue_grant(self.client, continue_uri, interact_ref, access_token).await
190 }
191
192 pub async fn cancel(&self, continue_uri: &str, access_token: Option<&str>) -> Result<()> {
193 cancel_grant(self.client, continue_uri, access_token).await
194 }
195 }
196
197 pub struct Token<'a> {
198 client: &'a AuthenticatedOpenPaymentsClient,
199 }
200
201 impl<'a> Token<'a> {
202 pub(crate) fn new(client: &'a AuthenticatedOpenPaymentsClient) -> Self {
203 Self { client }
204 }
205
206 pub async fn rotate(
207 &self,
208 auth_url: &str,
209 access_token: Option<&str>,
210 ) -> Result<AccessTokenResponse> {
211 rotate_access_token(self.client, auth_url, access_token).await
212 }
213
214 pub async fn revoke(&self, auth_url: &str, access_token: Option<&str>) -> Result<()> {
215 revoke_access_token(self.client, auth_url, access_token).await
216 }
217 }
218}
219
220pub mod unauthenticated {
221 use super::*;
222
223 pub struct WalletAddressResource<'a, C: BaseClient> {
224 client: &'a C,
225 }
226
227 impl<'a, C: BaseClient> WalletAddressResource<'a, C> {
228 pub(crate) fn new(client: &'a C) -> Self {
229 Self { client }
230 }
231
232 pub async fn get(&self, wallet_address_url: &str) -> Result<WalletAddress> {
233 get_wallet_address(self.client.http_client(), wallet_address_url).await
234 }
235
236 pub async fn get_keys(&self, wallet: &WalletAddress) -> Result<JsonWebKeySet> {
237 get_keys(self.client.http_client(), wallet).await
238 }
239
240 pub async fn get_did_document(&self, _wallet: &WalletAddress) -> Result<()> {
241 unimplemented!()
242 }
243 }
244
245 pub struct IncomingPaymentResource<'a, C: BaseClient> {
246 client: &'a C,
247 }
248
249 impl<'a, C: BaseClient> IncomingPaymentResource<'a, C> {
250 pub(crate) fn new(client: &'a C) -> Self {
251 Self { client }
252 }
253
254 pub async fn get(&self, payment_url: &str) -> Result<PublicIncomingPayment> {
255 get_public_incoming_payment(self.client, payment_url).await
256 }
257 }
258}
259
260pub trait AuthenticatedResources {
261 fn quotes(&self) -> authenticated::QuoteResource<'_>;
262 fn incoming_payments(&self) -> authenticated::IncomingPaymentResource<'_>;
263 fn outgoing_payments(&self) -> authenticated::OutgoingPaymentResource<'_>;
264 fn grant(&self) -> authenticated::Grant<'_>;
265 fn token(&self) -> authenticated::Token<'_>;
266}
267
268pub trait UnauthenticatedResources: BaseClient + Sized {
270 fn wallet_address(&self) -> unauthenticated::WalletAddressResource<'_, Self>;
271 fn public_incoming_payments(&self) -> unauthenticated::IncomingPaymentResource<'_, Self>;
272}
273
274impl AuthenticatedResources for AuthenticatedOpenPaymentsClient {
275 fn quotes(&self) -> authenticated::QuoteResource<'_> {
276 authenticated::QuoteResource::new(self)
277 }
278
279 fn incoming_payments(&self) -> authenticated::IncomingPaymentResource<'_> {
280 authenticated::IncomingPaymentResource::new(self)
281 }
282
283 fn outgoing_payments(&self) -> authenticated::OutgoingPaymentResource<'_> {
284 authenticated::OutgoingPaymentResource::new(self)
285 }
286
287 fn grant(&self) -> authenticated::Grant<'_> {
288 authenticated::Grant::new(self)
289 }
290
291 fn token(&self) -> authenticated::Token<'_> {
292 authenticated::Token::new(self)
293 }
294}
295
296impl<C: BaseClient> UnauthenticatedResources for C {
297 fn wallet_address(&self) -> unauthenticated::WalletAddressResource<'_, Self> {
298 unauthenticated::WalletAddressResource::new(self)
299 }
300
301 fn public_incoming_payments(&self) -> unauthenticated::IncomingPaymentResource<'_, Self> {
302 unauthenticated::IncomingPaymentResource::new(self)
303 }
304}