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}