use std::error::Error;
use std::fmt;
use async_trait::async_trait;
use rusoto_core::credential::ProvideAwsCredentials;
use rusoto_core::region;
use rusoto_core::request::{BufferedHttpResponse, DispatchSignedRequest};
use rusoto_core::{Client, RusotoError};
use rusoto_core::proto;
use rusoto_core::request::HttpResponse;
use rusoto_core::signature::SignedRequest;
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
impl MigrationHubConfigClient {
fn new_signed_request(&self, http_method: &str, request_uri: &str) -> SignedRequest {
let mut request = SignedRequest::new(http_method, "mgh", &self.region, request_uri);
request.set_endpoint_prefix("migrationhub-config".to_string());
request.set_content_type("application/x-amz-json-1.1".to_owned());
request
}
async fn sign_and_dispatch<E>(
&self,
request: SignedRequest,
from_response: fn(BufferedHttpResponse) -> RusotoError<E>,
) -> Result<HttpResponse, RusotoError<E>> {
let mut response = self.client.sign_and_dispatch(request).await?;
if !response.status.is_success() {
let response = response.buffer().await.map_err(RusotoError::HttpDispatch)?;
return Err(from_response(response));
}
Ok(response)
}
}
use serde_json;
#[derive(Clone, Debug, Default, PartialEq, Serialize)]
#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
pub struct CreateHomeRegionControlRequest {
#[serde(rename = "DryRun")]
#[serde(skip_serializing_if = "Option::is_none")]
pub dry_run: Option<bool>,
#[serde(rename = "HomeRegion")]
pub home_region: String,
#[serde(rename = "Target")]
pub target: Target,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[cfg_attr(any(test, feature = "serialize_structs"), derive(Serialize))]
pub struct CreateHomeRegionControlResult {
#[serde(rename = "HomeRegionControl")]
#[serde(skip_serializing_if = "Option::is_none")]
pub home_region_control: Option<HomeRegionControl>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize)]
#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
pub struct DescribeHomeRegionControlsRequest {
#[serde(rename = "ControlId")]
#[serde(skip_serializing_if = "Option::is_none")]
pub control_id: Option<String>,
#[serde(rename = "HomeRegion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub home_region: Option<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 = "Target")]
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<Target>,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[cfg_attr(any(test, feature = "serialize_structs"), derive(Serialize))]
pub struct DescribeHomeRegionControlsResult {
#[serde(rename = "HomeRegionControls")]
#[serde(skip_serializing_if = "Option::is_none")]
pub home_region_controls: Option<Vec<HomeRegionControl>>,
#[serde(rename = "NextToken")]
#[serde(skip_serializing_if = "Option::is_none")]
pub next_token: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize)]
#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
pub struct GetHomeRegionRequest {}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[cfg_attr(any(test, feature = "serialize_structs"), derive(Serialize))]
pub struct GetHomeRegionResult {
#[serde(rename = "HomeRegion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub home_region: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[cfg_attr(any(test, feature = "serialize_structs"), derive(Serialize))]
pub struct HomeRegionControl {
#[serde(rename = "ControlId")]
#[serde(skip_serializing_if = "Option::is_none")]
pub control_id: Option<String>,
#[serde(rename = "HomeRegion")]
#[serde(skip_serializing_if = "Option::is_none")]
pub home_region: Option<String>,
#[serde(rename = "RequestedTime")]
#[serde(skip_serializing_if = "Option::is_none")]
pub requested_time: Option<f64>,
#[serde(rename = "Target")]
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<Target>,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct Target {
#[serde(rename = "Id")]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(rename = "Type")]
pub type_: String,
}
#[derive(Debug, PartialEq)]
pub enum CreateHomeRegionControlError {
AccessDenied(String),
DryRunOperation(String),
InternalServerError(String),
InvalidInput(String),
ServiceUnavailable(String),
Throttling(String),
}
impl CreateHomeRegionControlError {
pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CreateHomeRegionControlError> {
if let Some(err) = proto::json::Error::parse(&res) {
match err.typ.as_str() {
"AccessDeniedException" => {
return RusotoError::Service(CreateHomeRegionControlError::AccessDenied(
err.msg,
))
}
"DryRunOperation" => {
return RusotoError::Service(CreateHomeRegionControlError::DryRunOperation(
err.msg,
))
}
"InternalServerError" => {
return RusotoError::Service(CreateHomeRegionControlError::InternalServerError(
err.msg,
))
}
"InvalidInputException" => {
return RusotoError::Service(CreateHomeRegionControlError::InvalidInput(
err.msg,
))
}
"ServiceUnavailableException" => {
return RusotoError::Service(CreateHomeRegionControlError::ServiceUnavailable(
err.msg,
))
}
"ThrottlingException" => {
return RusotoError::Service(CreateHomeRegionControlError::Throttling(err.msg))
}
"ValidationException" => return RusotoError::Validation(err.msg),
_ => {}
}
}
RusotoError::Unknown(res)
}
}
impl fmt::Display for CreateHomeRegionControlError {
#[allow(unused_variables)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
CreateHomeRegionControlError::AccessDenied(ref cause) => write!(f, "{}", cause),
CreateHomeRegionControlError::DryRunOperation(ref cause) => write!(f, "{}", cause),
CreateHomeRegionControlError::InternalServerError(ref cause) => write!(f, "{}", cause),
CreateHomeRegionControlError::InvalidInput(ref cause) => write!(f, "{}", cause),
CreateHomeRegionControlError::ServiceUnavailable(ref cause) => write!(f, "{}", cause),
CreateHomeRegionControlError::Throttling(ref cause) => write!(f, "{}", cause),
}
}
}
impl Error for CreateHomeRegionControlError {}
#[derive(Debug, PartialEq)]
pub enum DescribeHomeRegionControlsError {
AccessDenied(String),
InternalServerError(String),
InvalidInput(String),
ServiceUnavailable(String),
Throttling(String),
}
impl DescribeHomeRegionControlsError {
pub fn from_response(
res: BufferedHttpResponse,
) -> RusotoError<DescribeHomeRegionControlsError> {
if let Some(err) = proto::json::Error::parse(&res) {
match err.typ.as_str() {
"AccessDeniedException" => {
return RusotoError::Service(DescribeHomeRegionControlsError::AccessDenied(
err.msg,
))
}
"InternalServerError" => {
return RusotoError::Service(
DescribeHomeRegionControlsError::InternalServerError(err.msg),
)
}
"InvalidInputException" => {
return RusotoError::Service(DescribeHomeRegionControlsError::InvalidInput(
err.msg,
))
}
"ServiceUnavailableException" => {
return RusotoError::Service(
DescribeHomeRegionControlsError::ServiceUnavailable(err.msg),
)
}
"ThrottlingException" => {
return RusotoError::Service(DescribeHomeRegionControlsError::Throttling(
err.msg,
))
}
"ValidationException" => return RusotoError::Validation(err.msg),
_ => {}
}
}
RusotoError::Unknown(res)
}
}
impl fmt::Display for DescribeHomeRegionControlsError {
#[allow(unused_variables)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
DescribeHomeRegionControlsError::AccessDenied(ref cause) => write!(f, "{}", cause),
DescribeHomeRegionControlsError::InternalServerError(ref cause) => {
write!(f, "{}", cause)
}
DescribeHomeRegionControlsError::InvalidInput(ref cause) => write!(f, "{}", cause),
DescribeHomeRegionControlsError::ServiceUnavailable(ref cause) => {
write!(f, "{}", cause)
}
DescribeHomeRegionControlsError::Throttling(ref cause) => write!(f, "{}", cause),
}
}
}
impl Error for DescribeHomeRegionControlsError {}
#[derive(Debug, PartialEq)]
pub enum GetHomeRegionError {
AccessDenied(String),
InternalServerError(String),
InvalidInput(String),
ServiceUnavailable(String),
Throttling(String),
}
impl GetHomeRegionError {
pub fn from_response(res: BufferedHttpResponse) -> RusotoError<GetHomeRegionError> {
if let Some(err) = proto::json::Error::parse(&res) {
match err.typ.as_str() {
"AccessDeniedException" => {
return RusotoError::Service(GetHomeRegionError::AccessDenied(err.msg))
}
"InternalServerError" => {
return RusotoError::Service(GetHomeRegionError::InternalServerError(err.msg))
}
"InvalidInputException" => {
return RusotoError::Service(GetHomeRegionError::InvalidInput(err.msg))
}
"ServiceUnavailableException" => {
return RusotoError::Service(GetHomeRegionError::ServiceUnavailable(err.msg))
}
"ThrottlingException" => {
return RusotoError::Service(GetHomeRegionError::Throttling(err.msg))
}
"ValidationException" => return RusotoError::Validation(err.msg),
_ => {}
}
}
RusotoError::Unknown(res)
}
}
impl fmt::Display for GetHomeRegionError {
#[allow(unused_variables)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
GetHomeRegionError::AccessDenied(ref cause) => write!(f, "{}", cause),
GetHomeRegionError::InternalServerError(ref cause) => write!(f, "{}", cause),
GetHomeRegionError::InvalidInput(ref cause) => write!(f, "{}", cause),
GetHomeRegionError::ServiceUnavailable(ref cause) => write!(f, "{}", cause),
GetHomeRegionError::Throttling(ref cause) => write!(f, "{}", cause),
}
}
}
impl Error for GetHomeRegionError {}
#[async_trait]
pub trait MigrationHubConfig {
async fn create_home_region_control(
&self,
input: CreateHomeRegionControlRequest,
) -> Result<CreateHomeRegionControlResult, RusotoError<CreateHomeRegionControlError>>;
async fn describe_home_region_controls(
&self,
input: DescribeHomeRegionControlsRequest,
) -> Result<DescribeHomeRegionControlsResult, RusotoError<DescribeHomeRegionControlsError>>;
async fn get_home_region(&self)
-> Result<GetHomeRegionResult, RusotoError<GetHomeRegionError>>;
}
#[derive(Clone)]
pub struct MigrationHubConfigClient {
client: Client,
region: region::Region,
}
impl MigrationHubConfigClient {
pub fn new(region: region::Region) -> MigrationHubConfigClient {
MigrationHubConfigClient {
client: Client::shared(),
region,
}
}
pub fn new_with<P, D>(
request_dispatcher: D,
credentials_provider: P,
region: region::Region,
) -> MigrationHubConfigClient
where
P: ProvideAwsCredentials + Send + Sync + 'static,
D: DispatchSignedRequest + Send + Sync + 'static,
{
MigrationHubConfigClient {
client: Client::new_with(credentials_provider, request_dispatcher),
region,
}
}
pub fn new_with_client(client: Client, region: region::Region) -> MigrationHubConfigClient {
MigrationHubConfigClient { client, region }
}
}
#[async_trait]
impl MigrationHubConfig for MigrationHubConfigClient {
async fn create_home_region_control(
&self,
input: CreateHomeRegionControlRequest,
) -> Result<CreateHomeRegionControlResult, RusotoError<CreateHomeRegionControlError>> {
let mut request = self.new_signed_request("POST", "/");
request.add_header(
"x-amz-target",
"AWSMigrationHubMultiAccountService.CreateHomeRegionControl",
);
let encoded = serde_json::to_string(&input).unwrap();
request.set_payload(Some(encoded));
let response = self
.sign_and_dispatch(request, CreateHomeRegionControlError::from_response)
.await?;
let mut response = response;
let response = response.buffer().await.map_err(RusotoError::HttpDispatch)?;
proto::json::ResponsePayload::new(&response)
.deserialize::<CreateHomeRegionControlResult, _>()
}
async fn describe_home_region_controls(
&self,
input: DescribeHomeRegionControlsRequest,
) -> Result<DescribeHomeRegionControlsResult, RusotoError<DescribeHomeRegionControlsError>>
{
let mut request = self.new_signed_request("POST", "/");
request.add_header(
"x-amz-target",
"AWSMigrationHubMultiAccountService.DescribeHomeRegionControls",
);
let encoded = serde_json::to_string(&input).unwrap();
request.set_payload(Some(encoded));
let response = self
.sign_and_dispatch(request, DescribeHomeRegionControlsError::from_response)
.await?;
let mut response = response;
let response = response.buffer().await.map_err(RusotoError::HttpDispatch)?;
proto::json::ResponsePayload::new(&response)
.deserialize::<DescribeHomeRegionControlsResult, _>()
}
async fn get_home_region(
&self,
) -> Result<GetHomeRegionResult, RusotoError<GetHomeRegionError>> {
let mut request = self.new_signed_request("POST", "/");
request.add_header(
"x-amz-target",
"AWSMigrationHubMultiAccountService.GetHomeRegion",
);
request.set_payload(Some(bytes::Bytes::from_static(b"{}")));
let response = self
.sign_and_dispatch(request, GetHomeRegionError::from_response)
.await?;
let mut response = response;
let response = response.buffer().await.map_err(RusotoError::HttpDispatch)?;
proto::json::ResponsePayload::new(&response).deserialize::<GetHomeRegionResult, _>()
}
}