Unverified Commit e36d3469 authored by John DiSanti's avatar John DiSanti Committed by GitHub
Browse files

Revamp errors in `aws-smithy-types` (#1893)

parent 7b6d2d4b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -16,8 +16,9 @@ allowed_external_types = [
   "aws_smithy_types::retry",
   "aws_smithy_types::retry::*",
   "aws_smithy_types::timeout",
   "aws_smithy_types::timeout::config::TimeoutConfig",
   "aws_smithy_types::timeout::error::ConfigError",
   "aws_smithy_types::timeout::OperationTimeoutConfig",
   "aws_smithy_types::timeout::TimeoutConfig",
   "aws_smithy_types::timeout::TimeoutConfigBuilder",
   "aws_types::*",
   "http::response::Response",
   "http::uri::Uri",
+5 −2
Original line number Diff line number Diff line
@@ -3,8 +3,11 @@
 * SPDX-License-Identifier: Apache-2.0
 */

//! Default Provider chains for [`region`](default_provider::region), [`credentials`](default_provider::credentials),
//! [retries](default_provider::retry_config), [timeouts](default_provider::timeout_config) and [app name](default_provider::app_name).
//! Providers that implement the default AWS provider chain
//!
//! Default Provider chains for [`region`](crate::default_provider::region), [`credentials`](crate::default_provider::credentials),
//! [retries](crate::default_provider::retry_config), [timeouts](crate::default_provider::timeout_config) and
//! [app name](crate::default_provider::app_name).
//!
//! Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly
//! if you need to set custom configuration options to override the default resolution chain.
+4 −4
Original line number Diff line number Diff line
@@ -3,11 +3,11 @@
 * SPDX-License-Identifier: Apache-2.0
 */

use aws_smithy_types::retry::RetryConfig;

use crate::environment::retry_config::EnvironmentVariableRetryConfigProvider;
use crate::profile;
use crate::provider_config::ProviderConfig;
use aws_smithy_types::error::display::DisplayErrorContext;
use aws_smithy_types::retry::RetryConfig;

/// Default RetryConfig Provider chain
///
@@ -90,11 +90,11 @@ impl Builder {
        // We match this instead of unwrapping so we can print the error with the `Display` impl instead of the `Debug` impl that unwrap uses
        let builder_from_env = match self.env_provider.retry_config_builder() {
            Ok(retry_config_builder) => retry_config_builder,
            Err(err) => panic!("{}", err),
            Err(err) => panic!("{}", DisplayErrorContext(&err)),
        };
        let builder_from_profile = match self.profile_file.build().retry_config_builder().await {
            Ok(retry_config_builder) => retry_config_builder,
            Err(err) => panic!("{}", err),
            Err(err) => panic!("{}", DisplayErrorContext(&err)),
        };

        builder_from_env
+2 −0
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
 * SPDX-License-Identifier: Apache-2.0
 */

//! Providers that load configuration from environment variables

/// Load app name from the environment
pub mod app_name;
pub use app_name::EnvironmentVariableAppNameProvider;
+24 −15
Original line number Diff line number Diff line
@@ -3,10 +3,11 @@
 * SPDX-License-Identifier: Apache-2.0
 */

use std::str::FromStr;

use aws_smithy_types::retry::{RetryConfigBuilder, RetryConfigErr, RetryMode};
use crate::retry::{
    error::RetryConfigError, error::RetryConfigErrorKind, RetryConfigBuilder, RetryMode,
};
use aws_types::os_shim_internal::Env;
use std::str::FromStr;

const ENV_VAR_MAX_ATTEMPTS: &str = "AWS_MAX_ATTEMPTS";
const ENV_VAR_RETRY_MODE: &str = "AWS_RETRY_MODE";
@@ -35,20 +36,22 @@ impl EnvironmentVariableRetryConfigProvider {
    }

    /// Attempt to create a new `RetryConfig` from environment variables
    pub fn retry_config_builder(&self) -> Result<RetryConfigBuilder, RetryConfigErr> {
    pub fn retry_config_builder(&self) -> Result<RetryConfigBuilder, RetryConfigError> {
        let max_attempts = match self.env.get(ENV_VAR_MAX_ATTEMPTS).ok() {
            Some(max_attempts) => match max_attempts.parse::<u32>() {
                Ok(max_attempts) if max_attempts == 0 => {
                    return Err(RetryConfigErr::MaxAttemptsMustNotBeZero {
                    return Err(RetryConfigErrorKind::MaxAttemptsMustNotBeZero {
                        set_by: "environment variable".into(),
                    });
                    }
                    .into());
                }
                Ok(max_attempts) => Some(max_attempts),
                Err(source) => {
                    return Err(RetryConfigErr::FailedToParseMaxAttempts {
                    return Err(RetryConfigErrorKind::FailedToParseMaxAttempts {
                        set_by: "environment variable".into(),
                        source,
                    });
                    }
                    .into());
                }
            },
            None => None,
@@ -58,10 +61,11 @@ impl EnvironmentVariableRetryConfigProvider {
            Ok(retry_mode) => match RetryMode::from_str(&retry_mode) {
                Ok(retry_mode) => Some(retry_mode),
                Err(retry_mode_err) => {
                    return Err(RetryConfigErr::InvalidRetryMode {
                    return Err(RetryConfigErrorKind::InvalidRetryMode {
                        set_by: "environment variable".into(),
                        source: retry_mode_err,
                    });
                    }
                    .into());
                }
            },
            Err(_) => None,
@@ -78,10 +82,11 @@ impl EnvironmentVariableRetryConfigProvider {

#[cfg(test)]
mod test {
    use aws_smithy_types::retry::{RetryConfig, RetryConfigErr, RetryMode};
    use aws_types::os_shim_internal::Env;

    use super::{EnvironmentVariableRetryConfigProvider, ENV_VAR_MAX_ATTEMPTS, ENV_VAR_RETRY_MODE};
    use crate::retry::{
        error::RetryConfigError, error::RetryConfigErrorKind, RetryConfig, RetryMode,
    };
    use aws_types::os_shim_internal::Env;

    fn test_provider(vars: &[(&str, &str)]) -> EnvironmentVariableRetryConfigProvider {
        EnvironmentVariableRetryConfigProvider::new_with_env(Env::from_slice(vars))
@@ -112,7 +117,9 @@ mod test {
            test_provider(&[(ENV_VAR_MAX_ATTEMPTS, "not an integer")])
                .retry_config_builder()
                .unwrap_err(),
            RetryConfigErr::FailedToParseMaxAttempts { .. }
            RetryConfigError {
                kind: RetryConfigErrorKind::FailedToParseMaxAttempts { .. }
            }
        ));
    }

@@ -148,7 +155,9 @@ mod test {
            .unwrap_err();
        assert!(matches!(
            err,
            RetryConfigErr::MaxAttemptsMustNotBeZero { .. }
            RetryConfigError {
                kind: RetryConfigErrorKind::MaxAttemptsMustNotBeZero { .. }
            }
        ));
    }
}
Loading