async-mpesa 0.2.1

A rust library for accessing mpesa apis
Documentation
use derive_builder::UninitializedFieldError;
use serde::Deserialize;

#[derive(Debug, thiserror::Error)]
pub enum MpesaError {
    #[error("http error: {0}")]
    Reqwest(#[from] reqwest::Error),
    #[error("{}: {}", .0.requestId, .0.errorMessage)]
    ApiError(ApiError),
    #[error("failed to deserialize api response: {0}")]
    JsonDeserialize(serde_json::Error),
    #[error("Invalid args: {0}")]
    InvalidArgument(String),
}

#[allow(non_snake_case)]
#[derive(Debug, Deserialize)]
pub struct ApiError {
    pub errorMessage: String,
    pub requestId: String,
    pub errorCode: String
}

pub(crate) fn map_deserialization_error(e: serde_json::Error, bytes: &[u8]) -> MpesaError {
    tracing::error!(
        "failed deserialization of: {}",
        String::from_utf8_lossy(bytes.as_ref())
    );
    MpesaError::JsonDeserialize(e)
}

impl From<UninitializedFieldError> for MpesaError {
    fn from(value: UninitializedFieldError) -> Self {
        MpesaError::InvalidArgument(value.to_string())
    }
}