rust_sync_force 0.3.2

Salesforce Sync REST API Client
Documentation
use serde_json::Value;

use crate::response::ErrorResponse;

#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("not logged in")]
    NotLoggedIn,

    #[error("Error from Salesforce status: {status:?}, url: {url:?}, body: {sfdc_errors:?}, transport_error: {transport_error:?}")]
    SfdcError {
        status: u16,
        url: String,
        sfdc_errors: Option<Vec<ErrorResponse>>,
        transport_error: Option<String>,
    },

    #[error("Error: {0}")]
    GenericError(String),

    #[error("Input Output Error {0}")]
    IOError(#[from] ::std::io::Error),
}

impl From<ureq::Error> for Error {
    fn from(e: ureq::Error) -> Self {
        match e {
            ureq::Error::Status(status, response) => {
                let url = response.get_url().to_string();
                let response_string = format!("{:?}", response);
                let message = if let Ok(response_value) = response.into_json::<Value>() {
                    response_value
                } else {
                    Value::String(response_string)
                };
                let error_response = ErrorResponse {
                    message,
                    error_code: "".to_string(),
                    fields: None,
                };
                return Error::SfdcError {
                    status,
                    url,
                    sfdc_errors: Some(vec![error_response]),
                    transport_error: None,
                };
            }
            ureq::Error::Transport(transport) => Error::SfdcError {
                status: 0,
                url: transport.url().unwrap().to_string(),
                sfdc_errors: None,
                transport_error: Some(transport.to_string()),
            },
        }
    }
}