ebay 0.2.0

eBay API client for Rust.
Documentation
use super::EbayClient;
use crate::result::EbayResult;
use reqwest::Method;
use serde_json::Value;
use std::collections::HashMap;

#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EbayHttpMethod {
  Get,
  Post,
  Put,
  Delete,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct EbayRequest {
  pub method: EbayHttpMethod,
  pub path: String,
  pub query: Option<Vec<(String, String)>>,
  pub body: Option<Value>,
}

#[derive(Debug, Serialize)]
pub struct EbayResponse {
  pub headers: HashMap<String, String>,
  pub status_code: u16,
  pub body: Option<Value>,
}

impl EbayClient {
  pub fn proxy_request(&self, req: &EbayRequest) -> EbayResult<EbayResponse> {
    let method = match req.method {
      EbayHttpMethod::Get => Method::Get,
      EbayHttpMethod::Post => Method::Post,
      EbayHttpMethod::Put => Method::Put,
      EbayHttpMethod::Delete => Method::Delete,
    };
    let mut b = self.request(method, &req.path)?;

    if let Some(ref query) = req.query {
      b.query(query);
    }

    let mut res = if let Some(ref body) = req.body {
      b.json(body).send()?
    } else {
      b.send()?
    }
    .error_for_status()?;
    Ok(EbayResponse {
      headers: res
        .headers()
        .iter()
        .map(|view| (view.name().to_string(), view.value_string()))
        .collect(),
      status_code: res.status().as_u16(),
      body: res.json().ok(),
    })
  }
}