use std::error::Error;
use std::fmt;
use std::io;
#[allow(warnings)]
use futures::future;
use futures::Future;
use rusoto_core::region;
use rusoto_core::request::{BufferedHttpResponse, DispatchSignedRequest};
use rusoto_core::{Client, RusotoFuture};
use rusoto_core::credential::{CredentialsError, ProvideAwsCredentials};
use rusoto_core::request::HttpDispatchError;
use rusoto_core::signature::SignedRequest;
use serde_json;
use serde_json::from_slice;
use serde_json::Value as SerdeJsonValue;
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
#[cfg_attr(test, derive(Serialize))]
pub struct Entitlement {
#[serde(rename = "CustomerIdentifier")]
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_identifier: Option<String>,
#[serde(rename = "Dimension")]
#[serde(skip_serializing_if = "Option::is_none")]
pub dimension: Option<String>,
#[serde(rename = "ExpirationDate")]
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_date: Option<f64>,
#[serde(rename = "ProductCode")]
#[serde(skip_serializing_if = "Option::is_none")]
pub product_code: Option<String>,
#[serde(rename = "Value")]
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<EntitlementValue>,
}
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
#[cfg_attr(test, derive(Serialize))]
pub struct EntitlementValue {
#[serde(rename = "BooleanValue")]
#[serde(skip_serializing_if = "Option::is_none")]
pub boolean_value: Option<bool>,
#[serde(rename = "DoubleValue")]
#[serde(skip_serializing_if = "Option::is_none")]
pub double_value: Option<f64>,
#[serde(rename = "IntegerValue")]
#[serde(skip_serializing_if = "Option::is_none")]
pub integer_value: Option<i64>,
#[serde(rename = "StringValue")]
#[serde(skip_serializing_if = "Option::is_none")]
pub string_value: Option<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize)]
pub struct GetEntitlementsRequest {
#[serde(rename = "Filter")]
#[serde(skip_serializing_if = "Option::is_none")]
pub filter: Option<::std::collections::HashMap<String, Vec<String>>>,
#[serde(rename = "MaxResults")]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<i64>,
#[serde(rename = "NextToken")]
#[serde(skip_serializing_if = "Option::is_none")]
pub next_token: Option<String>,
#[serde(rename = "ProductCode")]
pub product_code: String,
}
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
#[cfg_attr(test, derive(Serialize))]
pub struct GetEntitlementsResult {
#[serde(rename = "Entitlements")]
#[serde(skip_serializing_if = "Option::is_none")]
pub entitlements: Option<Vec<Entitlement>>,
#[serde(rename = "NextToken")]
#[serde(skip_serializing_if = "Option::is_none")]
pub next_token: Option<String>,
}
#[derive(Debug, PartialEq)]
pub enum GetEntitlementsError {
InternalServiceError(String),
InvalidParameter(String),
Throttling(String),
HttpDispatch(HttpDispatchError),
Credentials(CredentialsError),
Validation(String),
ParseError(String),
Unknown(BufferedHttpResponse),
}
impl GetEntitlementsError {
pub fn from_response(res: BufferedHttpResponse) -> GetEntitlementsError {
if let Ok(json) = from_slice::<SerdeJsonValue>(&res.body) {
let raw_error_type = json
.get("__type")
.and_then(|e| e.as_str())
.unwrap_or("Unknown");
let error_message = json.get("message").and_then(|m| m.as_str()).unwrap_or("");
let pieces: Vec<&str> = raw_error_type.split("#").collect();
let error_type = pieces.last().expect("Expected error type");
match *error_type {
"InternalServiceErrorException" => {
return GetEntitlementsError::InternalServiceError(String::from(error_message));
}
"InvalidParameterException" => {
return GetEntitlementsError::InvalidParameter(String::from(error_message));
}
"ThrottlingException" => {
return GetEntitlementsError::Throttling(String::from(error_message));
}
"ValidationException" => {
return GetEntitlementsError::Validation(error_message.to_string());
}
_ => {}
}
}
return GetEntitlementsError::Unknown(res);
}
}
impl From<serde_json::error::Error> for GetEntitlementsError {
fn from(err: serde_json::error::Error) -> GetEntitlementsError {
GetEntitlementsError::ParseError(err.description().to_string())
}
}
impl From<CredentialsError> for GetEntitlementsError {
fn from(err: CredentialsError) -> GetEntitlementsError {
GetEntitlementsError::Credentials(err)
}
}
impl From<HttpDispatchError> for GetEntitlementsError {
fn from(err: HttpDispatchError) -> GetEntitlementsError {
GetEntitlementsError::HttpDispatch(err)
}
}
impl From<io::Error> for GetEntitlementsError {
fn from(err: io::Error) -> GetEntitlementsError {
GetEntitlementsError::HttpDispatch(HttpDispatchError::from(err))
}
}
impl fmt::Display for GetEntitlementsError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.description())
}
}
impl Error for GetEntitlementsError {
fn description(&self) -> &str {
match *self {
GetEntitlementsError::InternalServiceError(ref cause) => cause,
GetEntitlementsError::InvalidParameter(ref cause) => cause,
GetEntitlementsError::Throttling(ref cause) => cause,
GetEntitlementsError::Validation(ref cause) => cause,
GetEntitlementsError::Credentials(ref err) => err.description(),
GetEntitlementsError::HttpDispatch(ref dispatch_error) => dispatch_error.description(),
GetEntitlementsError::ParseError(ref cause) => cause,
GetEntitlementsError::Unknown(_) => "unknown error",
}
}
}
pub trait MarketplaceEntitlement {
fn get_entitlements(
&self,
input: GetEntitlementsRequest,
) -> RusotoFuture<GetEntitlementsResult, GetEntitlementsError>;
}
#[derive(Clone)]
pub struct MarketplaceEntitlementClient {
client: Client,
region: region::Region,
}
impl MarketplaceEntitlementClient {
pub fn new(region: region::Region) -> MarketplaceEntitlementClient {
MarketplaceEntitlementClient {
client: Client::shared(),
region: region,
}
}
pub fn new_with<P, D>(
request_dispatcher: D,
credentials_provider: P,
region: region::Region,
) -> MarketplaceEntitlementClient
where
P: ProvideAwsCredentials + Send + Sync + 'static,
P::Future: Send,
D: DispatchSignedRequest + Send + Sync + 'static,
D::Future: Send,
{
MarketplaceEntitlementClient {
client: Client::new_with(credentials_provider, request_dispatcher),
region: region,
}
}
}
impl MarketplaceEntitlement for MarketplaceEntitlementClient {
fn get_entitlements(
&self,
input: GetEntitlementsRequest,
) -> RusotoFuture<GetEntitlementsResult, GetEntitlementsError> {
let mut request = SignedRequest::new("POST", "aws-marketplace", &self.region, "/");
request.set_endpoint_prefix("entitlement.marketplace".to_string());
request.set_content_type("application/x-amz-json-1.1".to_owned());
request.add_header("x-amz-target", "AWSMPEntitlementService.GetEntitlements");
let encoded = serde_json::to_string(&input).unwrap();
request.set_payload(Some(encoded.into_bytes()));
self.client.sign_and_dispatch(request, |response| {
if response.status.is_success() {
Box::new(response.buffer().from_err().map(|response| {
let mut body = response.body;
if body.is_empty() || body == b"null" {
body = b"{}".to_vec();
}
serde_json::from_str::<GetEntitlementsResult>(
String::from_utf8_lossy(body.as_ref()).as_ref(),
)
.unwrap()
}))
} else {
Box::new(
response
.buffer()
.from_err()
.and_then(|response| Err(GetEntitlementsError::from_response(response))),
)
}
})
}
}
#[cfg(test)]
mod protocol_tests {}