Skip to content

Commit fe2af48

Browse files
authored
Merge pull request #67 from dxphilo/master
fix: extract an api struct to store error details
2 parents 3d78a33 + 0bb0e90 commit fe2af48

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

src/client.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::services::{
33
AccountBalanceBuilder, B2bBuilder, B2cBuilder, C2bRegisterBuilder, C2bSimulateBuilder,
44
MpesaExpressRequestBuilder, TransactionReversalBuilder, TransactionStatusBuilder,
55
};
6-
use crate::MpesaError;
6+
use crate::{ApiError, MpesaError};
77
use openssl::base64;
88
use openssl::rsa::Padding;
99
use openssl::x509::X509;
@@ -116,14 +116,17 @@ impl<'mpesa, Env: ApiEnvironment> Mpesa<Env> {
116116
let value = response.json::<Value>().await?;
117117
let access_token = value
118118
.get("access_token")
119-
.ok_or_else(|| MpesaError::AuthenticationError(value.clone()))?;
119+
.ok_or_else(|| String::from("Failed to extract token from the response"))
120+
.unwrap();
120121
let access_token = access_token
121122
.as_str()
122-
.ok_or_else(|| MpesaError::AuthenticationError(value.clone()))?;
123+
.ok_or_else(|| String::from("Error converting access token to string"))
124+
.unwrap();
125+
123126
return Ok(access_token.to_string());
124127
}
125-
let value = response.json::<Value>().await?;
126-
Err(MpesaError::AuthenticationError(value))
128+
let error = response.json::<ApiError>().await?;
129+
Err(MpesaError::AuthenticationError(error))
127130
}
128131

129132
/// **B2C Builder**

src/errors.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
1-
use std::env::VarError;
1+
use serde::{Deserialize, Serialize};
2+
use std::{env::VarError, fmt};
23

34
/// Mpesa error stack
45
#[derive(thiserror::Error, Debug)]
56
pub enum MpesaError {
6-
#[error("Authentication request failed: {0}")]
7-
AuthenticationError(serde_json::Value),
7+
#[error("{0}")]
8+
AuthenticationError(ApiError),
89
#[error("B2B request failed: {0}")]
9-
B2bError(serde_json::Value),
10+
B2bError(ApiError),
1011
#[error("B2C request failed: {0}")]
11-
B2cError(serde_json::Value),
12+
B2cError(ApiError),
1213
#[error("C2B register request failed: {0}")]
13-
C2bRegisterError(serde_json::Value),
14+
C2bRegisterError(ApiError),
1415
#[error("C2B simulate request failed: {0}")]
15-
C2bSimulateError(serde_json::Value),
16+
C2bSimulateError(ApiError),
1617
#[error("Account Balance request failed: {0}")]
17-
AccountBalanceError(serde_json::Value),
18+
AccountBalanceError(ApiError),
1819
#[error("Mpesa Express request/ STK push failed: {0}")]
19-
MpesaExpressRequestError(serde_json::Value),
20+
MpesaExpressRequestError(ApiError),
2021
#[error("Mpesa Transaction reversal failed: {0}")]
21-
MpesaTransactionReversalError(serde_json::Value),
22+
MpesaTransactionReversalError(ApiError),
2223
#[error("Mpesa Transaction status failed: {0}")]
23-
MpesaTransactionStatusError(serde_json::Value),
24+
MpesaTransactionStatusError(ApiError),
2425
#[error("An error has occured while performing the http request")]
2526
NetworkError(#[from] reqwest::Error),
2627
#[error("An error has occured while serializig/ deserializing")]
@@ -32,3 +33,20 @@ pub enum MpesaError {
3233
#[error("{0}")]
3334
Message(&'static str),
3435
}
36+
37+
#[derive(Debug, Serialize, Deserialize)]
38+
pub struct ApiError {
39+
pub request_id: String,
40+
pub error_code: String,
41+
pub error_message: String,
42+
}
43+
44+
impl fmt::Display for ApiError {
45+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46+
write!(
47+
f,
48+
"requestID: {}, errorCode:{}, errorMessage:{}",
49+
self.request_id, self.error_code, self.error_message
50+
)
51+
}
52+
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,4 @@ pub use client::{Mpesa, MpesaResult};
357357
pub use constants::{CommandId, IdentifierTypes, ResponseType};
358358
pub use environment::ApiEnvironment;
359359
pub use environment::Environment::{self, Production, Sandbox};
360-
pub use errors::MpesaError;
360+
pub use errors::{ApiError, MpesaError};

0 commit comments

Comments
 (0)