async_mpesa/
error.rs

1use derive_builder::UninitializedFieldError;
2use serde::Deserialize;
3
4#[derive(Debug, thiserror::Error)]
5pub enum MpesaError {
6    #[error("http error: {0}")]
7    Reqwest(#[from] reqwest::Error),
8    #[error("{}: {}", .0.requestId, .0.errorMessage)]
9    ApiError(ApiError),
10    #[error("failed to deserialize api response: {0}")]
11    JsonDeserialize(serde_json::Error),
12    #[error("Invalid args: {0}")]
13    InvalidArgument(String),
14}
15
16#[allow(non_snake_case)]
17#[derive(Debug, Deserialize)]
18pub struct ApiError {
19    pub errorMessage: String,
20    pub requestId: String,
21    pub errorCode: String
22}
23
24pub(crate) fn map_deserialization_error(e: serde_json::Error, bytes: &[u8]) -> MpesaError {
25    tracing::error!(
26        "failed deserialization of: {}",
27        String::from_utf8_lossy(bytes.as_ref())
28    );
29    MpesaError::JsonDeserialize(e)
30}
31
32impl From<UninitializedFieldError> for MpesaError {
33    fn from(value: UninitializedFieldError) -> Self {
34        MpesaError::InvalidArgument(value.to_string())
35    }
36}