use chrono::{DateTime, Utc};
use client::{Client, Method};
mod types;
pub use self::types::*;
use result::MwsResult;
static PATH: &'static str = "/Orders/2013-09-01";
static VERSION: &'static str = "2013-09-01";
#[allow(non_snake_case)]
#[derive(Debug, Default, Serialize, SerializeMwsParams)]
pub struct ListOrdersParameters {
#[mws_param(list_item_type_name = "Id")]
pub MarketplaceId: Vec<String>,
pub CreatedAfter: Option<DateTime<Utc>>,
pub CreatedBefore: Option<DateTime<Utc>>,
pub LastUpdatedAfter: Option<DateTime<Utc>>,
pub LastUpdatedBefore: Option<DateTime<Utc>>,
#[mws_param(list_item_type_name = "Status")]
pub OrderStatus: Option<Vec<OrderStatus>>,
#[mws_param(list_item_type_name = "Channel")]
pub FulfillmentChannel: Option<Vec<FulfillmentChannel>>,
pub SellerOrderId: Option<String>,
pub BuyerEmail: Option<String>,
#[mws_param(list_item_type_name = "Method")]
pub PaymentMethod: Option<Vec<PaymentMethod>>,
#[mws_param(list_item_type_name = "Status")]
pub TFMShipmentStatus: Option<Vec<TFMShipmentStatus>>,
pub MaxResultsPerPage: Option<i32>,
}
#[allow(non_snake_case)]
#[derive(Debug, Default, Serialize, FromXmlStream)]
pub struct ListOrdersResponse {
pub Orders: Vec<Order>,
pub LastUpdatedBefore: Option<DateTime<Utc>>,
pub CreatedBefore: Option<DateTime<Utc>>,
pub NextToken: Option<String>,
}
response_envelope_type!(
ListOrdersEnvelope<ListOrdersResponse>,
"ListOrdersResponse",
"ListOrdersResult"
);
response_envelope_type!(
ListOrdersByNextTokenEnvelope<ListOrdersResponse>,
"ListOrdersByNextTokenResponse",
"ListOrdersByNextTokenResult"
);
#[allow(non_snake_case)]
pub fn ListOrders(
client: &Client,
parameters: ListOrdersParameters,
) -> MwsResult<ListOrdersResponse> {
client
.request_xml(Method::Post, PATH, VERSION, "ListOrders", parameters)
.map(|e: ListOrdersEnvelope| e.into_inner())
.map_err(|err| err.into())
}
#[allow(non_snake_case)]
pub fn ListOrdersByNextToken(client: &Client, next_token: String) -> MwsResult<ListOrdersResponse> {
let params = vec![("NextToken".to_string(), next_token)];
client
.request_xml(Method::Post, PATH, VERSION, "ListOrdersByNextToken", params)
.map(|e: ListOrdersByNextTokenEnvelope| e.into_inner())
.map_err(|err| err.into())
}
#[allow(non_snake_case)]
#[derive(Debug, Default, Serialize, FromXmlStream)]
pub struct ListOrderItemsResponse {
pub OrderItems: Vec<OrderItem>,
pub AmazonOrderId: String,
pub NextToken: Option<String>,
}
response_envelope_type!(
ListOrderItemsEnvelope<ListOrderItemsResponse>,
"ListOrderItemsResponse",
"ListOrderItemsResult"
);
response_envelope_type!(
ListOrderItemsByNextTokenEnvelope<ListOrderItemsResponse>,
"ListOrderItemsByNextTokenResponse",
"ListOrderItemsByNextTokenResult"
);
#[allow(non_snake_case)]
pub fn ListOrderItems(
client: &Client,
amazon_order_id: String,
) -> MwsResult<ListOrderItemsResponse> {
let params = vec![("AmazonOrderId".to_string(), amazon_order_id)];
client
.request_xml(Method::Post, PATH, VERSION, "ListOrderItems", params)
.map(|e: ListOrderItemsEnvelope| e.into_inner())
.map_err(|err| err.into())
}
#[allow(non_snake_case)]
pub fn ListOrderItemsByNextToken(
client: &Client,
next_token: String,
) -> MwsResult<ListOrderItemsResponse> {
let params = vec![("NextToken".to_string(), next_token)];
client
.request_xml(
Method::Post,
PATH,
VERSION,
"ListOrderItemsByNextToken",
params,
).map(|e: ListOrderItemsByNextTokenEnvelope| e.into_inner())
.map_err(|err| err.into())
}
#[cfg(test)]
mod tests {
use super::super::client::get_test_client;
use super::*;
use dotenv::dotenv;
#[test]
#[ignore]
fn test_list_orders() {
dotenv().ok();
let c = get_test_client();
let mut params = ListOrdersParameters::default();
params.MarketplaceId.push("ATVPDKIKX0DER".to_string());
params.CreatedAfter = Some("2016-11-01T04:00:00Z".parse().expect("parse created_after"));
params.MaxResultsPerPage = Some(1);
let res = ListOrders(&c, params).expect("ListOrders");
println!("{:#?}", res)
}
#[test]
#[ignore]
fn test_list_order_items() {
dotenv().ok();
let c = get_test_client();
let res = ListOrderItems(&c, "112-8095165-5463447".to_string()).expect("ListOrderItems");
println!("{:#?}", res)
}
}