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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//! # SumUp Rust SDK
//!
//! Official Rust SDK for the SumUp REST API.
//!
//! ## Quick Start
//!
//! ```no_run
//! use sumup::Client;
//!
//! #[tokio::main]
//! async fn main() {
//! // Create a client (reads SUMUP_API_KEY from environment)
//! let client = Client::default();
//!
//! // Call an API endpoint
//! let checkouts = client
//! .checkouts()
//! .list(Default::default())
//! .await
//! .expect("list checkouts request failed");
//! println!("found {} checkouts", checkouts.len());
//! }
//! ```
//!
//! ## Configuration
//!
//! ### Authentication
//!
//! Set your API key via environment variable or explicitly:
//!
//! ```no_run
//! # use sumup::{Authorization, Client};
//! // From environment variable SUMUP_API_KEY
//! let client = Client::default();
//!
//! // Explicit token
//! let client = Client::default()
//! .with_authorization(Authorization::api_key("your_api_key"));
//! ```
//!
//! ### Custom Configuration
//!
//! ```no_run
//! # use sumup::{Authorization, Client};
//! use std::time::Duration;
//!
//! let client = Client::default()
//! .with_authorization(Authorization::api_key("your_api_key"))
//! .with_timeout(Duration::from_secs(30));
//! ```
//!
//! ## Making API Calls
//!
//! The SDK organizes endpoints by tags:
//!
//! ```no_run
//! # use sumup::{Client, Currency, checkouts};
//! # async fn example(client: Client) {
//! // Create a checkout
//! let checkout = client.checkouts().create(checkouts::CheckoutCreateRequest {
//! checkout_reference: "unique-ref".to_string(),
//! amount: 10.0,
//! currency: Currency::EUR,
//! merchant_code: "MCODE".to_string(),
//! description: None,
//! return_url: None,
//! customer_id: None,
//! purpose: None,
//! valid_until: None,
//! redirect_url: None,
//! })
//! .await
//! .expect("create checkout");
//! println!("created checkout {}", checkout.id.unwrap_or_default());
//!
//! // Transactions with query parameters
//! use sumup::resources::transactions::ListParams;
//! let transactions = client
//! .transactions()
//! .list(
//! "MERCHANT_CODE",
//! ListParams {
//! limit: Some(10),
//! ..Default::default()
//! },
//! )
//! .await
//! .expect("list transactions");
//! let count = transactions.items.as_ref().map_or(0, |items| items.len());
//! println!("fetched {} historical transactions", count);
//! # }
//! ```
//!
//! ## DateTime Support
//!
//! The SDK supports both [`chrono`](https://docs.rs/chrono) (default) and
//! [`jiff`](https://docs.rs/jiff) for datetime types:
//!
//! ```toml
//! # Use chrono (default)
//! [dependencies]
//! sumup = "0.0.1"
//!
//! # Use jiff instead
//! [dependencies]
//! sumup = { version = "0.0.1", default-features = false, features = ["jiff"] }
//! ```
//!
//! ## Error Handling
//!
//! All SDK calls return a [`SdkResult`] whose error side is a [`SdkError`]. When the
//! SumUp API responds with a non-success status, the SDK builds an
//! `SdkError::Api` containing an endpoint-specific payload (e.g. a `Unauthorized`
//! enum variant). Any undocumented status codes fall back to
//! `SdkError::Unexpected`, which preserves the HTTP status and best-effort body
//! parsing. You can inspect failures like this:
//!
//! ```no_run
//! # use sumup::{Client, error::SdkError};
//! # use sumup::resources::checkouts::ListErrorBody;
//! # async fn example() {
//! let client = Client::default();
//! match client.checkouts().list(Default::default()).await {
//! Ok(checkouts) => println!("retrieved {} checkouts", checkouts.len()),
//! Err(SdkError::Api(body)) => match body {
//! ListErrorBody::Unauthorized(details) => eprintln!("unauthorized: {:?}", details),
//! },
//! Err(SdkError::Unexpected(status, body)) => {
//! eprintln!("unexpected {} response: {}", status, body);
//! }
//! Err(SdkError::Network(err)) => panic!("network error: {}", err),
//! }
//! # }
//! ```
//!
//! ## Features
//!
//! - **chrono** (default): Use chrono for datetime types
//! - **jiff**: Use jiff for datetime types (mutually exclusive with chrono)
//!
//! ## Resources
//!
//! - [API Documentation](https://developer.sumup.com/docs/)
//! - [GitHub Repository](https://github.com/sumup/sumup-rs)
pub use crate*;
pub use Authorization;
pub use Client;
pub use ;
pub use Nullable;
pub use Secret;
pub use VERSION;