#![allow(clippy::all)]
#![allow(
dead_code,
unused_imports,
unused_variables,
non_snake_case,
rustdoc::all
)]
use crate::core::{Client, Error, Method, QueryParams, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Clone)]
pub struct Amazon {
client: Client,
}
impl Amazon {
pub(crate) fn new(client: Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
&self.client
}
pub async fn autocomplete(&self, params: AutocompleteParams) -> Result<AutocompleteResponse> {
let path = "/v1/amazon/autocomplete".to_string();
let mut q = QueryParams::new();
q.opt("query", params.query.as_ref());
q.opt("domain", params.domain.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_bestsellers(
&self,
params: GetBestsellersParams,
) -> Result<GetBestsellersResponse> {
let path = "/v1/amazon/bestsellers".to_string();
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("category", params.category.as_ref());
q.opt("page", params.page.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn list_categories(
&self,
params: ListCategoriesParams,
) -> Result<ListCategoriesResponse> {
let path = "/v1/amazon/categories".to_string();
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn browse_category(
&self,
params: BrowseCategoryParams,
) -> Result<BrowseCategoryResponse> {
let path = "/v1/amazon/category".to_string();
let mut q = QueryParams::new();
q.opt("node", params.node.as_ref());
q.opt("domain", params.domain.as_ref());
q.opt("page", params.page.as_ref());
q.opt("sort_by", params.sort_by.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_deals(&self, params: GetDealsParams) -> Result<GetDealsResponse> {
let path = "/v1/amazon/deals".to_string();
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("category", params.category.as_ref());
q.opt("page", params.page.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn list_markets(&self, params: ListMarketsParams) -> Result<ListMarketsResponse> {
let path = "/v1/amazon/markets".to_string();
let query: Vec<(String, String)> = Vec::new();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_new_releases(
&self,
params: GetNewReleasesParams,
) -> Result<GetNewReleasesResponse> {
let path = "/v1/amazon/new-releases".to_string();
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("category", params.category.as_ref());
q.opt("page", params.page.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_product(
&self,
asin: impl AsRef<str>,
params: GetProductParams,
) -> Result<GetProductResponse> {
let path = format!("/v1/amazon/products/{asin}", asin = asin.as_ref());
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("zip", params.zip.as_ref());
q.opt("language", params.language.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_offers(
&self,
asin: impl AsRef<str>,
params: GetOffersParams,
) -> Result<GetOffersResponse> {
let path = format!("/v1/amazon/products/{asin}/offers", asin = asin.as_ref());
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("zip", params.zip.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_reviews(
&self,
asin: impl AsRef<str>,
params: GetReviewsParams,
) -> Result<GetReviewsResponse> {
let path = format!("/v1/amazon/products/{asin}/reviews", asin = asin.as_ref());
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("page", params.page.as_ref());
q.opt("sort_by", params.sort_by.as_ref());
q.opt("star", params.star.as_ref());
q.opt("verified_only", params.verified_only.as_ref());
q.opt("media_only", params.media_only.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn search_products(
&self,
params: SearchProductsParams,
) -> Result<SearchProductsResponse> {
let path = "/v1/amazon/search".to_string();
let mut q = QueryParams::new();
q.opt("query", params.query.as_ref());
q.opt("domain", params.domain.as_ref());
q.opt("page", params.page.as_ref());
q.opt("sort_by", params.sort_by.as_ref());
q.opt("category", params.category.as_ref());
q.opt("min_price", params.min_price.as_ref());
q.opt("max_price", params.max_price.as_ref());
q.opt("zip", params.zip.as_ref());
q.opt("language", params.language.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_seller(
&self,
seller_id: impl AsRef<str>,
params: GetSellerParams,
) -> Result<GetSellerResponse> {
let path = format!(
"/v1/amazon/sellers/{seller_id}",
seller_id = seller_id.as_ref()
);
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_seller_feedback(
&self,
seller_id: impl AsRef<str>,
params: GetSellerFeedbackParams,
) -> Result<GetSellerFeedbackResponse> {
let path = format!(
"/v1/amazon/sellers/{seller_id}/feedback",
seller_id = seller_id.as_ref()
);
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("page", params.page.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
pub async fn get_seller_products(
&self,
seller_id: impl AsRef<str>,
params: GetSellerProductsParams,
) -> Result<GetSellerProductsResponse> {
let path = format!(
"/v1/amazon/sellers/{seller_id}/products",
seller_id = seller_id.as_ref()
);
let mut q = QueryParams::new();
q.opt("domain", params.domain.as_ref());
q.opt("page", params.page.as_ref());
let query = q.into_pairs();
let body = None;
self.client.send(Method::GET, &path, &query, body).await
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct AmazonPrice {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub currency: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub raw: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub symbol: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub value: Option<f64>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct AutocompleteResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub query: Option<String>,
pub suggestions: Vec<AutocompleteResponseSuggestionsItem>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct AutocompleteResponseSuggestionsItem {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub alias: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub value: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Bestseller {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub image: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub link: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub position: Option<i64>,
pub price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub rank: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub rating: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_total: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub title: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct BrowseCategoryResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub node: Option<String>,
pub pagination: Option<Pagination>,
pub results: Vec<SearchResult>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum BrowseCategorySortBy {
#[serde(rename = "relevance")]
Relevance,
#[serde(rename = "price_low_to_high")]
PriceLowToHigh,
#[serde(rename = "price_high_to_low")]
PriceHighToLow,
#[serde(rename = "avg_review")]
AvgReview,
#[serde(rename = "newest")]
Newest,
}
impl std::fmt::Display for BrowseCategorySortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
BrowseCategorySortBy::Relevance => "relevance",
BrowseCategorySortBy::PriceLowToHigh => "price_low_to_high",
BrowseCategorySortBy::PriceHighToLow => "price_high_to_low",
BrowseCategorySortBy::AvgReview => "avg_review",
BrowseCategorySortBy::Newest => "newest",
})
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Deal {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub badge: Option<String>,
pub deal_price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub deal_type: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub discount_percent: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub ends_at: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub ends_at_utc: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub image: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_lightning_deal: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub link: Option<String>,
pub list_price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub position: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub title: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetBestsellersResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub category: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub results: Vec<Bestseller>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetDealsResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub category: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub results: Vec<Deal>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetNewReleasesResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub category: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub results: Vec<Bestseller>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetOffersResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub offers: Vec<Offer>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetProductResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub product: Option<Product>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetReviewsResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub pagination: Option<Pagination>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub rating: Option<f64>,
pub rating_breakdown: Option<GetReviewsResponseRatingBreakdown>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_total: Option<i64>,
pub reviews: Vec<Review>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetReviewsResponseRatingBreakdown {
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub five_star: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub four_star: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub one_star: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub three_star: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub two_star: Option<i64>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum GetReviewsSortBy {
#[serde(rename = "helpful")]
Helpful,
#[serde(rename = "recent")]
Recent,
}
impl std::fmt::Display for GetReviewsSortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
GetReviewsSortBy::Helpful => "helpful",
GetReviewsSortBy::Recent => "recent",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum GetReviewsStar {
#[serde(rename = "one_star")]
OneStar,
#[serde(rename = "two_star")]
TwoStar,
#[serde(rename = "three_star")]
ThreeStar,
#[serde(rename = "four_star")]
FourStar,
#[serde(rename = "five_star")]
FiveStar,
#[serde(rename = "positive")]
Positive,
#[serde(rename = "critical")]
Critical,
}
impl std::fmt::Display for GetReviewsStar {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
GetReviewsStar::OneStar => "one_star",
GetReviewsStar::TwoStar => "two_star",
GetReviewsStar::ThreeStar => "three_star",
GetReviewsStar::FourStar => "four_star",
GetReviewsStar::FiveStar => "five_star",
GetReviewsStar::Positive => "positive",
GetReviewsStar::Critical => "critical",
})
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetSellerFeedbackResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub feedback: Vec<GetSellerFeedbackResponseFeedbackItem>,
pub pagination: Option<Pagination>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub seller_id: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetSellerFeedbackResponseFeedbackItem {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub body: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub date_at: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub date_raw: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub rater: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub rating: Option<i64>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetSellerProductsResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub pagination: Option<Pagination>,
pub results: Vec<SearchResult>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub seller_id: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct GetSellerResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub seller: Option<Seller>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ListCategoriesResponse {
pub categories: Vec<ListCategoriesResponseCategoriesItem>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ListCategoriesResponseCategoriesItem {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub alias: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub bestsellers_node: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub name: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ListMarketsResponse {
pub markets: Vec<ListMarketsResponseMarketsItem>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ListMarketsResponseMarketsItem {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub code: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub country_code: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub currency: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub language: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub name: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Offer {
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub buybox_winner: Option<bool>,
pub condition: HashMap<String, Value>,
pub delivery: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_prime: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub maximum_order_quantity: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub minimum_order_quantity: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub position: Option<i64>,
pub price: Option<AmazonPrice>,
pub seller: HashMap<String, Value>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Pagination {
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub current_page: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub total_pages: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub total_results: Option<i64>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Product {
pub also_bought: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub answered_questions: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
pub attributes: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub availability: Option<String>,
pub badges: HashMap<String, Value>,
pub bestsellers_rank: Vec<HashMap<String, Value>>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub bought_past_month: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub brand: Option<String>,
pub buybox: HashMap<String, Value>,
pub categories: Vec<HashMap<String, Value>>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub country_of_origin: Option<String>,
pub coupon: Option<HashMap<String, Value>>,
pub deal: Option<HashMap<String, Value>>,
pub delivery: Option<HashMap<String, Value>>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub description: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub dimensions: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub discount_percent: Option<i64>,
pub feature_bullets: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub first_available: Option<String>,
pub frequently_bought_together: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub fulfilled_by: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub has_aplus_content: Option<bool>,
pub images: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub images_count: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub in_stock: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_amazon_seller: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub link: Option<String>,
pub list_price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub main_image: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub manufacturer: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub model_number: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub parent_asin: Option<String>,
pub price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub rating: Option<f64>,
pub rating_breakdown: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_total: Option<i64>,
pub savings_amount: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub scraped_at: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub scraped_utc: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub ships_from: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub sold_by: Option<String>,
pub specifications: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub title: Option<String>,
pub top_reviews: Vec<Review>,
pub variant_asins: Vec<String>,
pub variants: Vec<HashMap<String, Value>>,
pub videos: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub videos_count: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub weight: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Review {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub body: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub date_at: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub date_raw: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub date_utc: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub helpful_votes: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub id: Option<String>,
pub images: Vec<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_global_review: Option<bool>,
pub profile: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub rating: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub review_country: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub title: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub variant: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub verified_purchase: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub vine_program: Option<bool>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct SearchProductsResponse {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub domain: Option<String>,
pub pagination: Option<Pagination>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub query: Option<String>,
pub results: Vec<SearchResult>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum SearchProductsSortBy {
#[serde(rename = "relevance")]
Relevance,
#[serde(rename = "price_low_to_high")]
PriceLowToHigh,
#[serde(rename = "price_high_to_low")]
PriceHighToLow,
#[serde(rename = "avg_review")]
AvgReview,
#[serde(rename = "newest")]
Newest,
}
impl std::fmt::Display for SearchProductsSortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
SearchProductsSortBy::Relevance => "relevance",
SearchProductsSortBy::PriceLowToHigh => "price_low_to_high",
SearchProductsSortBy::PriceHighToLow => "price_high_to_low",
SearchProductsSortBy::AvgReview => "avg_review",
SearchProductsSortBy::Newest => "newest",
})
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct SearchResult {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub asin: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub availability: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub bought_past_month: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub coupon: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub image: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_amazons_choice: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_best_seller: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_prime: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_bool")]
pub is_sponsored: Option<bool>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub link: Option<String>,
pub list_price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub position: Option<i64>,
pub price: Option<AmazonPrice>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub rating: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_total: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub title: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub unit_price: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct Seller {
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub business_address: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub business_name: Option<String>,
pub feedback: HashMap<String, Value>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub link: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub member_since: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub name: Option<String>,
#[serde(default, deserialize_with = "crate::core::flex::opt_f64")]
pub rating: Option<f64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_percentage_positive: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_i64")]
pub ratings_total: Option<i64>,
#[serde(default, deserialize_with = "crate::core::flex::opt_string")]
pub seller_id: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct AutocompleteParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetBestsellersParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct ListCategoriesParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct BrowseCategoryParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub node: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_by: Option<BrowseCategorySortBy>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetDealsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct ListMarketsParams {}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetNewReleasesParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetProductParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zip: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetOffersParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zip: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetReviewsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_by: Option<GetReviewsSortBy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub star: Option<GetReviewsStar>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media_only: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct SearchProductsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_by: Option<SearchProductsSortBy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_price: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_price: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zip: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetSellerParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetSellerFeedbackParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct GetSellerProductsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
}