Skip to content

Commit 36fabb2

Browse files
authored
feat: pass ApiClient to products by reference (#3)
fix: fix formatting warnings
1 parent dd5f8d7 commit 36fabb2

File tree

16 files changed

+149
-149
lines changed

16 files changed

+149
-149
lines changed

.github/workflows/release.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ jobs:
2121
toolchain: stable
2222
override: true
2323

24+
- name: Check formatting
25+
run: cargo fmt
26+
27+
- name: Check warnings
28+
run: cargo clippy
29+
2430
- name: Build release binary
2531
run: cargo build --release
2632

@@ -29,4 +35,4 @@ jobs:
2935
with:
3036
files: target/release/*
3137
env:
32-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
38+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ let client = ApiClient::new(config).expect("Failed to create API client");
4343
use smile_id::products::BasicKyc;
4444

4545
// Create a Basic KYC instance
46-
let basic_kyc = BasicKyc::new(client.clone());
46+
let basic_kyc = BasicKyc::new(&client());
4747

4848
// Submit a Basic KYC verification request
4949
let job_id = basic_kyc.verify(
@@ -64,7 +64,7 @@ println!("Job ID: {}", job_id);
6464
use smile_id::products::EnhancedKyc;
6565

6666
// Create an Enhanced KYC instance
67-
let enhanced_kyc = EnhancedKyc::new(client.clone());
67+
let enhanced_kyc = EnhancedKyc::new(&client());
6868

6969
// Submit an Enhanced KYC verification request
7070
let job_id = enhanced_kyc.verify(
@@ -86,7 +86,7 @@ use smile_id::products::BiometricKyc;
8686
use smile_id::utils;
8787

8888
// Create a Biometric KYC instance
89-
let biometric_kyc = BiometricKyc::new(client.clone());
89+
let biometric_kyc = BiometricKyc::new(&client());
9090

9191
// Encode a selfie image as base64
9292
let selfie_image = utils::encode_image_file("path/to/selfie.jpg")
@@ -113,7 +113,7 @@ use smile_id::products::DocumentVerification;
113113
use smile_id::utils;
114114

115115
// Create a Document Verification instance
116-
let document_verification = DocumentVerification::new(client.clone());
116+
let document_verification = DocumentVerification::new(&client());
117117

118118
// Encode document images as base64
119119
let front_image = utils::encode_image_file("path/to/front.jpg")
@@ -138,7 +138,7 @@ use smile_id::products::SmartSelfieAuth;
138138
use smile_id::utils;
139139

140140
// Create a SmartSelfie™ Authentication instance
141-
let smartselfie_auth = SmartSelfieAuth::new(client.clone());
141+
let smartselfie_auth = SmartSelfieAuth::new(&client());
142142

143143
// Encode a selfie image as base64
144144
let selfie_image = utils::encode_image_file("path/to/selfie.jpg")
@@ -160,7 +160,7 @@ println!("Job ID: {}", job_id);
160160
use smile_id::products::BusinessVerification;
161161

162162
// Create a Business Verification instance
163-
let business_verification = BusinessVerification::new(client.clone());
163+
let business_verification = BusinessVerification::new(&client());
164164

165165
// Submit a Business Verification request
166166
let job_id = business_verification.verify(
@@ -204,7 +204,7 @@ let config = Config::new("your-api-key", "your-partner-id");
204204
let client = ApiClient::new(config).expect("Failed to create API client");
205205

206206
// Create a blocking Basic KYC instance
207-
let basic_kyc = BasicKyc::new(client.clone());
207+
let basic_kyc = BasicKyc::new(&client());
208208

209209
// Submit a Basic KYC verification request
210210
let job_id = basic_kyc.verify(

src/api.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ use crate::error::{Error, Result};
1010
use crate::models::{ApiResponse, JobStatusRequest, JobStatusResponse};
1111

1212
#[derive(Debug, Clone)]
13-
pub struct ApiClient {
13+
pub struct ApiClient<'a> {
1414
client: Client,
1515
auth: Auth,
16-
config: Config,
16+
config: &'a Config,
1717
}
1818

19-
impl ApiClient {
20-
pub fn new(config: Config) -> Result<Self> {
19+
impl<'a> ApiClient<'a> {
20+
pub fn new(config: &'a Config) -> Result<Self> {
2121
let client = ClientBuilder::new()
2222
.timeout(Duration::from_secs(config.timeout))
2323
.build()
@@ -103,13 +103,13 @@ pub mod blocking {
103103
use super::*;
104104

105105
#[derive(Debug, Clone)]
106-
pub struct ApiClient {
106+
pub struct ApiClient<'a> {
107107
client: reqwest::blocking::Client,
108108
auth: Auth,
109-
config: Config,
109+
config: &Config,
110110
}
111111

112-
impl ApiClient {
112+
impl<'a> ApiClient<'a> {
113113
pub fn new(config: Config) -> Result<Self> {
114114
let client = reqwest::blocking::ClientBuilder::new()
115115
.timeout(Duration::from_secs(config.timeout))

src/auth.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::error::{Error, Result};
12
use base64::{engine::general_purpose, Engine};
3+
use chrono::{DateTime, Utc};
24
use hmac::{Hmac, Mac};
35
use sha2::Sha256;
4-
use chrono::{Utc, DateTime};
5-
use crate::error::{Error, Result};
66

77
type HmacSha256 = Hmac<Sha256>;
88

@@ -19,26 +19,31 @@ impl Auth {
1919
partner_id: partner_id.into(),
2020
}
2121
}
22-
22+
2323
pub fn generate_signature(&self, timestamp: &DateTime<Utc>, payload: &str) -> Result<String> {
2424
let timestamp_str = timestamp.to_rfc3339();
2525
let message = format!("{}{}{}", self.partner_id, timestamp_str, payload);
26-
26+
2727
let mut mac = HmacSha256::new_from_slice(self.api_key.as_bytes())
28-
.map_err(|e| Error::Auth(format!("Failed to create HMAC: {}", e)))?;
29-
28+
.map_err(|e| Error::Auth(format!("Failed to create HMAC: {e}")))?;
29+
3030
mac.update(message.as_bytes());
3131
let result = mac.finalize();
3232
let signature = general_purpose::STANDARD.encode(result.into_bytes());
33-
33+
3434
Ok(signature)
3535
}
36-
37-
pub fn verify_signature(&self, signature: &str, timestamp: &DateTime<Utc>, payload: &str) -> Result<bool> {
36+
37+
pub fn verify_signature(
38+
&self,
39+
signature: &str,
40+
timestamp: &DateTime<Utc>,
41+
payload: &str,
42+
) -> Result<bool> {
3843
let expected_signature = self.generate_signature(timestamp, payload)?;
3944
Ok(signature == expected_signature)
4045
}
41-
46+
4247
pub fn partner_id(&self) -> &str {
4348
&self.partner_id
4449
}

src/config.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ impl Config {
1717
timeout: 30,
1818
}
1919
}
20-
20+
2121
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
2222
self.base_url = base_url.into();
2323
self
2424
}
25-
25+
2626
pub fn with_version(mut self, version: impl Into<String>) -> Self {
2727
self.version = version.into();
2828
self
2929
}
30-
30+
3131
pub fn with_timeout(mut self, timeout: u64) -> Self {
3232
self.timeout = timeout;
3333
self

src/error.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ pub enum Error {
1111
Json(#[from] serde_json::Error),
1212

1313
#[error("API error: {status_code} - {message}")]
14-
Api {
15-
status_code: u16,
16-
message: String,
17-
},
14+
Api { status_code: u16, message: String },
1815

1916
#[error("Authentication error: {0}")]
2017
Auth(String),

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub use config::Config;
1212
pub use error::{Error, Result};
1313
pub use models::*;
1414
pub use products::*;
15+
pub use utils::*;
1516

1617
pub mod prelude {
1718
pub use crate::api::ApiClient;

src/models.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use std::collections::HashMap;
33

44
#[derive(Debug, Clone, Deserialize)]
55
pub struct ApiResponse<T> {
6-
76
pub status_code: u16,
87
pub message: String,
98

@@ -51,7 +50,6 @@ pub struct JobHistoryItem {
5150

5251
#[derive(Debug, Clone, Serialize)]
5352
pub struct BasicKycRequest {
54-
5553
pub id_type: String,
5654
pub id_number: String,
5755
pub country: String,
@@ -71,7 +69,6 @@ pub struct BasicKycRequest {
7169

7270
#[derive(Debug, Clone, Serialize)]
7371
pub struct EnhancedKycRequest {
74-
7572
pub id_type: String,
7673
pub id_number: String,
7774
pub country: String,
@@ -85,7 +82,6 @@ pub struct EnhancedKycRequest {
8582

8683
#[derive(Debug, Clone, Serialize)]
8784
pub struct BiometricKycRequest {
88-
8985
pub id_type: String,
9086
pub id_number: String,
9187
pub country: String,
@@ -100,7 +96,6 @@ pub struct BiometricKycRequest {
10096

10197
#[derive(Debug, Clone, Serialize)]
10298
pub struct DocumentVerificationRequest {
103-
10499
pub document_type: String,
105100
pub country: String,
106101
pub document_images: Vec<String>,
@@ -111,7 +106,6 @@ pub struct DocumentVerificationRequest {
111106

112107
#[derive(Debug, Clone, Serialize)]
113108
pub struct SmartSelfieAuthRequest {
114-
115109
pub user_id: String,
116110
pub job_id: String,
117111
pub selfie_image: String,
@@ -122,7 +116,6 @@ pub struct SmartSelfieAuthRequest {
122116

123117
#[derive(Debug, Clone, Serialize)]
124118
pub struct BusinessVerificationRequest {
125-
126119
pub business_name: String,
127120
pub registration_number: String,
128121
pub country: String,
@@ -133,7 +126,6 @@ pub struct BusinessVerificationRequest {
133126

134127
#[derive(Debug, Clone, Serialize)]
135128
pub struct JobStatusRequest {
136-
137129
pub user_id: String,
138130
pub job_id: String,
139131

src/products/basic_kyc.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ use crate::error::Result;
55
use crate::models::{ApiResponse, BasicKycRequest};
66

77
#[derive(Debug, Clone)]
8-
pub struct BasicKyc {
9-
client: ApiClient,
8+
pub struct BasicKyc<'a> {
9+
client: ApiClient<'a>,
1010
}
1111

12-
impl BasicKyc {
13-
pub fn new(client: ApiClient) -> Self {
12+
impl<'a> BasicKyc<'a> {
13+
pub fn new(client: ApiClient<'a>) -> Self {
1414
Self { client }
1515
}
16-
16+
1717
pub async fn verify(
1818
&self,
1919
id_type: impl Into<String>,
@@ -32,10 +32,10 @@ impl BasicKyc {
3232
dob,
3333
partner_params: None,
3434
};
35-
35+
3636
let url = format!("{}/basic_kyc", self.client.base_url());
3737
let response: ApiResponse<VerifyResponse> = self.client.post(&url, &request).await?;
38-
38+
3939
Ok(response.data.job_id)
4040
}
4141
}
@@ -49,17 +49,17 @@ struct VerifyResponse {
4949
pub mod blocking {
5050
use super::*;
5151
use crate::api::blocking::ApiClient;
52-
52+
5353
#[derive(Debug, Clone)]
54-
pub struct BasicKyc {
55-
client: ApiClient,
54+
pub struct BasicKyc<'a> {
55+
client: ApiClient<'a>,
5656
}
57-
58-
impl BasicKyc {
59-
pub fn new(client: ApiClient) -> Self {
57+
58+
impl<'a> BasicKyc<'a> {
59+
pub fn new(client: ApiClient<'a>) -> Self {
6060
Self { client }
6161
}
62-
62+
6363
pub fn verify(
6464
&self,
6565
id_type: impl Into<String>,
@@ -78,10 +78,10 @@ pub mod blocking {
7878
dob,
7979
partner_params: None,
8080
};
81-
81+
8282
let url = format!("{}/basic_kyc", self.client.base_url());
8383
let response: ApiResponse<VerifyResponse> = self.client.post(&url, &request)?;
84-
84+
8585
Ok(response.data.job_id)
8686
}
8787
}

0 commit comments

Comments
 (0)