aws_sdk_chime/config/
endpoint.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2pub use ::aws_smithy_runtime_api::client::endpoint::EndpointFuture;
3pub use ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver;
4pub use ::aws_smithy_types::endpoint::Endpoint;
5
6/// Interceptor that tracks endpoint override business metric.
7#[derive(Debug, Default)]
8pub(crate) struct EndpointOverrideFeatureTrackerInterceptor;
9
10impl ::aws_smithy_runtime_api::client::interceptors::Intercept for EndpointOverrideFeatureTrackerInterceptor {
11    fn name(&self) -> &'static str {
12        "EndpointOverrideFeatureTrackerInterceptor"
13    }
14
15    fn read_before_execution(
16        &self,
17        _context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_>,
18        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
19    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
20        if cfg.load::<::aws_types::endpoint_config::EndpointUrl>().is_some() {
21            cfg.interceptor_state()
22                .store_append(::aws_runtime::sdk_feature::AwsSdkFeature::EndpointOverride);
23        }
24        ::std::result::Result::Ok(())
25    }
26}
27
28#[cfg(test)]
29mod test {
30
31    /// For region aws-global with FIPS disabled and DualStack disabled
32    #[test]
33    fn test_1() {
34        let params = crate::config::endpoint::Params::builder()
35            .region("aws-global".to_string())
36            .use_fips(false)
37            .use_dual_stack(false)
38            .build()
39            .expect("invalid params");
40        let resolver = crate::config::endpoint::DefaultResolver::new();
41        let endpoint = resolver.resolve_endpoint(&params);
42        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-east-1.amazonaws.com");
43        assert_eq!(
44            endpoint,
45            ::aws_smithy_types::endpoint::Endpoint::builder()
46                .url("https://chime.us-east-1.amazonaws.com")
47                .property(
48                    "authSchemes",
49                    vec![{
50                        let mut out = ::std::collections::HashMap::<String, ::aws_smithy_types::Document>::new();
51                        out.insert("name".to_string(), "sigv4".to_string().into());
52                        out.insert("signingName".to_string(), "chime".to_string().into());
53                        out.insert("signingRegion".to_string(), "us-east-1".to_string().into());
54                        out
55                    }
56                    .into()]
57                )
58                .build()
59        );
60    }
61
62    /// For region us-east-1 with FIPS enabled and DualStack enabled
63    #[test]
64    fn test_2() {
65        let params = crate::config::endpoint::Params::builder()
66            .region("us-east-1".to_string())
67            .use_fips(true)
68            .use_dual_stack(true)
69            .build()
70            .expect("invalid params");
71        let resolver = crate::config::endpoint::DefaultResolver::new();
72        let endpoint = resolver.resolve_endpoint(&params);
73        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-east-1.api.aws");
74        assert_eq!(
75            endpoint,
76            ::aws_smithy_types::endpoint::Endpoint::builder()
77                .url("https://chime-fips.us-east-1.api.aws")
78                .build()
79        );
80    }
81
82    /// For region us-east-1 with FIPS enabled and DualStack disabled
83    #[test]
84    fn test_3() {
85        let params = crate::config::endpoint::Params::builder()
86            .region("us-east-1".to_string())
87            .use_fips(true)
88            .use_dual_stack(false)
89            .build()
90            .expect("invalid params");
91        let resolver = crate::config::endpoint::DefaultResolver::new();
92        let endpoint = resolver.resolve_endpoint(&params);
93        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-east-1.amazonaws.com");
94        assert_eq!(
95            endpoint,
96            ::aws_smithy_types::endpoint::Endpoint::builder()
97                .url("https://chime-fips.us-east-1.amazonaws.com")
98                .build()
99        );
100    }
101
102    /// For region us-east-1 with FIPS disabled and DualStack enabled
103    #[test]
104    fn test_4() {
105        let params = crate::config::endpoint::Params::builder()
106            .region("us-east-1".to_string())
107            .use_fips(false)
108            .use_dual_stack(true)
109            .build()
110            .expect("invalid params");
111        let resolver = crate::config::endpoint::DefaultResolver::new();
112        let endpoint = resolver.resolve_endpoint(&params);
113        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-east-1.api.aws");
114        assert_eq!(
115            endpoint,
116            ::aws_smithy_types::endpoint::Endpoint::builder()
117                .url("https://chime.us-east-1.api.aws")
118                .build()
119        );
120    }
121
122    /// For region us-east-1 with FIPS disabled and DualStack disabled
123    #[test]
124    fn test_5() {
125        let params = crate::config::endpoint::Params::builder()
126            .region("us-east-1".to_string())
127            .use_fips(false)
128            .use_dual_stack(false)
129            .build()
130            .expect("invalid params");
131        let resolver = crate::config::endpoint::DefaultResolver::new();
132        let endpoint = resolver.resolve_endpoint(&params);
133        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-east-1.amazonaws.com");
134        assert_eq!(
135            endpoint,
136            ::aws_smithy_types::endpoint::Endpoint::builder()
137                .url("https://chime.us-east-1.amazonaws.com")
138                .property(
139                    "authSchemes",
140                    vec![{
141                        let mut out = ::std::collections::HashMap::<String, ::aws_smithy_types::Document>::new();
142                        out.insert("name".to_string(), "sigv4".to_string().into());
143                        out.insert("signingName".to_string(), "chime".to_string().into());
144                        out.insert("signingRegion".to_string(), "us-east-1".to_string().into());
145                        out
146                    }
147                    .into()]
148                )
149                .build()
150        );
151    }
152
153    /// For region cn-north-1 with FIPS enabled and DualStack enabled
154    #[test]
155    fn test_6() {
156        let params = crate::config::endpoint::Params::builder()
157            .region("cn-north-1".to_string())
158            .use_fips(true)
159            .use_dual_stack(true)
160            .build()
161            .expect("invalid params");
162        let resolver = crate::config::endpoint::DefaultResolver::new();
163        let endpoint = resolver.resolve_endpoint(&params);
164        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.cn-north-1.api.amazonwebservices.com.cn");
165        assert_eq!(
166            endpoint,
167            ::aws_smithy_types::endpoint::Endpoint::builder()
168                .url("https://chime-fips.cn-north-1.api.amazonwebservices.com.cn")
169                .build()
170        );
171    }
172
173    /// For region cn-north-1 with FIPS enabled and DualStack disabled
174    #[test]
175    fn test_7() {
176        let params = crate::config::endpoint::Params::builder()
177            .region("cn-north-1".to_string())
178            .use_fips(true)
179            .use_dual_stack(false)
180            .build()
181            .expect("invalid params");
182        let resolver = crate::config::endpoint::DefaultResolver::new();
183        let endpoint = resolver.resolve_endpoint(&params);
184        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.cn-north-1.amazonaws.com.cn");
185        assert_eq!(
186            endpoint,
187            ::aws_smithy_types::endpoint::Endpoint::builder()
188                .url("https://chime-fips.cn-north-1.amazonaws.com.cn")
189                .build()
190        );
191    }
192
193    /// For region cn-north-1 with FIPS disabled and DualStack enabled
194    #[test]
195    fn test_8() {
196        let params = crate::config::endpoint::Params::builder()
197            .region("cn-north-1".to_string())
198            .use_fips(false)
199            .use_dual_stack(true)
200            .build()
201            .expect("invalid params");
202        let resolver = crate::config::endpoint::DefaultResolver::new();
203        let endpoint = resolver.resolve_endpoint(&params);
204        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.cn-north-1.api.amazonwebservices.com.cn");
205        assert_eq!(
206            endpoint,
207            ::aws_smithy_types::endpoint::Endpoint::builder()
208                .url("https://chime.cn-north-1.api.amazonwebservices.com.cn")
209                .build()
210        );
211    }
212
213    /// For region cn-north-1 with FIPS disabled and DualStack disabled
214    #[test]
215    fn test_9() {
216        let params = crate::config::endpoint::Params::builder()
217            .region("cn-north-1".to_string())
218            .use_fips(false)
219            .use_dual_stack(false)
220            .build()
221            .expect("invalid params");
222        let resolver = crate::config::endpoint::DefaultResolver::new();
223        let endpoint = resolver.resolve_endpoint(&params);
224        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.cn-north-1.amazonaws.com.cn");
225        assert_eq!(
226            endpoint,
227            ::aws_smithy_types::endpoint::Endpoint::builder()
228                .url("https://chime.cn-north-1.amazonaws.com.cn")
229                .build()
230        );
231    }
232
233    /// For region us-gov-east-1 with FIPS enabled and DualStack enabled
234    #[test]
235    fn test_10() {
236        let params = crate::config::endpoint::Params::builder()
237            .region("us-gov-east-1".to_string())
238            .use_fips(true)
239            .use_dual_stack(true)
240            .build()
241            .expect("invalid params");
242        let resolver = crate::config::endpoint::DefaultResolver::new();
243        let endpoint = resolver.resolve_endpoint(&params);
244        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-gov-east-1.api.aws");
245        assert_eq!(
246            endpoint,
247            ::aws_smithy_types::endpoint::Endpoint::builder()
248                .url("https://chime-fips.us-gov-east-1.api.aws")
249                .build()
250        );
251    }
252
253    /// For region us-gov-east-1 with FIPS enabled and DualStack disabled
254    #[test]
255    fn test_11() {
256        let params = crate::config::endpoint::Params::builder()
257            .region("us-gov-east-1".to_string())
258            .use_fips(true)
259            .use_dual_stack(false)
260            .build()
261            .expect("invalid params");
262        let resolver = crate::config::endpoint::DefaultResolver::new();
263        let endpoint = resolver.resolve_endpoint(&params);
264        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-gov-east-1.amazonaws.com");
265        assert_eq!(
266            endpoint,
267            ::aws_smithy_types::endpoint::Endpoint::builder()
268                .url("https://chime-fips.us-gov-east-1.amazonaws.com")
269                .build()
270        );
271    }
272
273    /// For region us-gov-east-1 with FIPS disabled and DualStack enabled
274    #[test]
275    fn test_12() {
276        let params = crate::config::endpoint::Params::builder()
277            .region("us-gov-east-1".to_string())
278            .use_fips(false)
279            .use_dual_stack(true)
280            .build()
281            .expect("invalid params");
282        let resolver = crate::config::endpoint::DefaultResolver::new();
283        let endpoint = resolver.resolve_endpoint(&params);
284        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-gov-east-1.api.aws");
285        assert_eq!(
286            endpoint,
287            ::aws_smithy_types::endpoint::Endpoint::builder()
288                .url("https://chime.us-gov-east-1.api.aws")
289                .build()
290        );
291    }
292
293    /// For region us-gov-east-1 with FIPS disabled and DualStack disabled
294    #[test]
295    fn test_13() {
296        let params = crate::config::endpoint::Params::builder()
297            .region("us-gov-east-1".to_string())
298            .use_fips(false)
299            .use_dual_stack(false)
300            .build()
301            .expect("invalid params");
302        let resolver = crate::config::endpoint::DefaultResolver::new();
303        let endpoint = resolver.resolve_endpoint(&params);
304        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-gov-east-1.amazonaws.com");
305        assert_eq!(
306            endpoint,
307            ::aws_smithy_types::endpoint::Endpoint::builder()
308                .url("https://chime.us-gov-east-1.amazonaws.com")
309                .build()
310        );
311    }
312
313    /// For region us-iso-east-1 with FIPS enabled and DualStack disabled
314    #[test]
315    fn test_14() {
316        let params = crate::config::endpoint::Params::builder()
317            .region("us-iso-east-1".to_string())
318            .use_fips(true)
319            .use_dual_stack(false)
320            .build()
321            .expect("invalid params");
322        let resolver = crate::config::endpoint::DefaultResolver::new();
323        let endpoint = resolver.resolve_endpoint(&params);
324        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-iso-east-1.c2s.ic.gov");
325        assert_eq!(
326            endpoint,
327            ::aws_smithy_types::endpoint::Endpoint::builder()
328                .url("https://chime-fips.us-iso-east-1.c2s.ic.gov")
329                .build()
330        );
331    }
332
333    /// For region us-iso-east-1 with FIPS disabled and DualStack disabled
334    #[test]
335    fn test_15() {
336        let params = crate::config::endpoint::Params::builder()
337            .region("us-iso-east-1".to_string())
338            .use_fips(false)
339            .use_dual_stack(false)
340            .build()
341            .expect("invalid params");
342        let resolver = crate::config::endpoint::DefaultResolver::new();
343        let endpoint = resolver.resolve_endpoint(&params);
344        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-iso-east-1.c2s.ic.gov");
345        assert_eq!(
346            endpoint,
347            ::aws_smithy_types::endpoint::Endpoint::builder()
348                .url("https://chime.us-iso-east-1.c2s.ic.gov")
349                .build()
350        );
351    }
352
353    /// For region us-isob-east-1 with FIPS enabled and DualStack disabled
354    #[test]
355    fn test_16() {
356        let params = crate::config::endpoint::Params::builder()
357            .region("us-isob-east-1".to_string())
358            .use_fips(true)
359            .use_dual_stack(false)
360            .build()
361            .expect("invalid params");
362        let resolver = crate::config::endpoint::DefaultResolver::new();
363        let endpoint = resolver.resolve_endpoint(&params);
364        let endpoint = endpoint.expect("Expected valid endpoint: https://chime-fips.us-isob-east-1.sc2s.sgov.gov");
365        assert_eq!(
366            endpoint,
367            ::aws_smithy_types::endpoint::Endpoint::builder()
368                .url("https://chime-fips.us-isob-east-1.sc2s.sgov.gov")
369                .build()
370        );
371    }
372
373    /// For region us-isob-east-1 with FIPS disabled and DualStack disabled
374    #[test]
375    fn test_17() {
376        let params = crate::config::endpoint::Params::builder()
377            .region("us-isob-east-1".to_string())
378            .use_fips(false)
379            .use_dual_stack(false)
380            .build()
381            .expect("invalid params");
382        let resolver = crate::config::endpoint::DefaultResolver::new();
383        let endpoint = resolver.resolve_endpoint(&params);
384        let endpoint = endpoint.expect("Expected valid endpoint: https://chime.us-isob-east-1.sc2s.sgov.gov");
385        assert_eq!(
386            endpoint,
387            ::aws_smithy_types::endpoint::Endpoint::builder()
388                .url("https://chime.us-isob-east-1.sc2s.sgov.gov")
389                .build()
390        );
391    }
392
393    /// For custom endpoint with region set and fips disabled and dualstack disabled
394    #[test]
395    fn test_18() {
396        let params = crate::config::endpoint::Params::builder()
397            .region("us-east-1".to_string())
398            .use_fips(false)
399            .use_dual_stack(false)
400            .endpoint("https://example.com".to_string())
401            .build()
402            .expect("invalid params");
403        let resolver = crate::config::endpoint::DefaultResolver::new();
404        let endpoint = resolver.resolve_endpoint(&params);
405        let endpoint = endpoint.expect("Expected valid endpoint: https://example.com");
406        assert_eq!(
407            endpoint,
408            ::aws_smithy_types::endpoint::Endpoint::builder().url("https://example.com").build()
409        );
410    }
411
412    /// For custom endpoint with region not set and fips disabled and dualstack disabled
413    #[test]
414    fn test_19() {
415        let params = crate::config::endpoint::Params::builder()
416            .use_fips(false)
417            .use_dual_stack(false)
418            .endpoint("https://example.com".to_string())
419            .build()
420            .expect("invalid params");
421        let resolver = crate::config::endpoint::DefaultResolver::new();
422        let endpoint = resolver.resolve_endpoint(&params);
423        let endpoint = endpoint.expect("Expected valid endpoint: https://example.com");
424        assert_eq!(
425            endpoint,
426            ::aws_smithy_types::endpoint::Endpoint::builder().url("https://example.com").build()
427        );
428    }
429
430    /// For custom endpoint with fips enabled and dualstack disabled
431    #[test]
432    fn test_20() {
433        let params = crate::config::endpoint::Params::builder()
434            .region("us-east-1".to_string())
435            .use_fips(true)
436            .use_dual_stack(false)
437            .endpoint("https://example.com".to_string())
438            .build()
439            .expect("invalid params");
440        let resolver = crate::config::endpoint::DefaultResolver::new();
441        let endpoint = resolver.resolve_endpoint(&params);
442        let error = endpoint.expect_err("expected error: Invalid Configuration: FIPS and custom endpoint are not supported [For custom endpoint with fips enabled and dualstack disabled]");
443        assert_eq!(format!("{}", error), "Invalid Configuration: FIPS and custom endpoint are not supported")
444    }
445
446    /// For custom endpoint with fips disabled and dualstack enabled
447    #[test]
448    fn test_21() {
449        let params = crate::config::endpoint::Params::builder()
450            .region("us-east-1".to_string())
451            .use_fips(false)
452            .use_dual_stack(true)
453            .endpoint("https://example.com".to_string())
454            .build()
455            .expect("invalid params");
456        let resolver = crate::config::endpoint::DefaultResolver::new();
457        let endpoint = resolver.resolve_endpoint(&params);
458        let error = endpoint.expect_err("expected error: Invalid Configuration: Dualstack and custom endpoint are not supported [For custom endpoint with fips disabled and dualstack enabled]");
459        assert_eq!(
460            format!("{}", error),
461            "Invalid Configuration: Dualstack and custom endpoint are not supported"
462        )
463    }
464
465    /// Missing region
466    #[test]
467    fn test_22() {
468        let params = crate::config::endpoint::Params::builder().build().expect("invalid params");
469        let resolver = crate::config::endpoint::DefaultResolver::new();
470        let endpoint = resolver.resolve_endpoint(&params);
471        let error = endpoint.expect_err("expected error: Invalid Configuration: Missing Region [Missing region]");
472        assert_eq!(format!("{}", error), "Invalid Configuration: Missing Region")
473    }
474}
475
476/// Endpoint resolver trait specific to Amazon Chime
477pub trait ResolveEndpoint: ::std::marker::Send + ::std::marker::Sync + ::std::fmt::Debug {
478    /// Resolve an endpoint with the given parameters
479    fn resolve_endpoint<'a>(&'a self, params: &'a crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a>;
480
481    /// Convert this service-specific resolver into a `SharedEndpointResolver`
482    ///
483    /// The resulting resolver will downcast `EndpointResolverParams` into `crate::config::endpoint::Params`.
484    fn into_shared_resolver(self) -> ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver
485    where
486        Self: Sized + 'static,
487    {
488        ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver::new(DowncastParams(self))
489    }
490}
491
492#[derive(Debug)]
493struct DowncastParams<T>(T);
494impl<T> ::aws_smithy_runtime_api::client::endpoint::ResolveEndpoint for DowncastParams<T>
495where
496    T: ResolveEndpoint,
497{
498    fn resolve_endpoint<'a>(
499        &'a self,
500        params: &'a ::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams,
501    ) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a> {
502        let ep = match params.get::<crate::config::endpoint::Params>() {
503            Some(params) => self.0.resolve_endpoint(params),
504            None => ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(Err("params of expected type was not present".into())),
505        };
506        ep
507    }
508}
509
510/// The default endpoint resolver
511#[derive(Debug, Default)]
512pub struct DefaultResolver {
513    partition_resolver: crate::endpoint_lib::partition::PartitionResolver,
514}
515
516impl DefaultResolver {
517    /// Create a new endpoint resolver with default settings
518    pub fn new() -> Self {
519        Self {
520            partition_resolver: crate::endpoint_lib::DEFAULT_PARTITION_RESOLVER.clone(),
521        }
522    }
523
524    fn resolve_endpoint(
525        &self,
526        params: &crate::config::endpoint::Params,
527    ) -> ::std::result::Result<::aws_smithy_types::endpoint::Endpoint, ::aws_smithy_runtime_api::box_error::BoxError> {
528        let mut diagnostic_collector = crate::endpoint_lib::diagnostic::DiagnosticCollector::new();
529        Ok(
530            crate::config::endpoint::internals::resolve_endpoint(params, &mut diagnostic_collector, &self.partition_resolver)
531                .map_err(|err| err.with_source(diagnostic_collector.take_last_error()))?,
532        )
533    }
534}
535
536impl crate::config::endpoint::ResolveEndpoint for DefaultResolver {
537    fn resolve_endpoint(&self, params: &crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'_> {
538        ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(self.resolve_endpoint(params))
539    }
540}
541
542#[non_exhaustive]
543#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
544/// Configuration parameters for resolving the correct endpoint
545pub struct Params {
546    /// The AWS region used to dispatch the request.
547    pub(crate) region: ::std::option::Option<::std::string::String>,
548    /// When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.
549    pub(crate) use_dual_stack: bool,
550    /// When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.
551    pub(crate) use_fips: bool,
552    /// Override the endpoint used to send this request
553    pub(crate) endpoint: ::std::option::Option<::std::string::String>,
554}
555impl Params {
556    /// Create a builder for [`Params`]
557    pub fn builder() -> crate::config::endpoint::ParamsBuilder {
558        crate::config::endpoint::ParamsBuilder::default()
559    }
560    /// The AWS region used to dispatch the request.
561    pub fn region(&self) -> ::std::option::Option<&str> {
562        self.region.as_deref()
563    }
564    /// When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.
565    pub fn use_dual_stack(&self) -> ::std::option::Option<bool> {
566        Some(self.use_dual_stack)
567    }
568    /// When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.
569    pub fn use_fips(&self) -> ::std::option::Option<bool> {
570        Some(self.use_fips)
571    }
572    /// Override the endpoint used to send this request
573    pub fn endpoint(&self) -> ::std::option::Option<&str> {
574        self.endpoint.as_deref()
575    }
576}
577
578/// Builder for [`Params`]
579#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::default::Default, ::std::fmt::Debug)]
580pub struct ParamsBuilder {
581    region: ::std::option::Option<::std::string::String>,
582    use_dual_stack: ::std::option::Option<bool>,
583    use_fips: ::std::option::Option<bool>,
584    endpoint: ::std::option::Option<::std::string::String>,
585}
586impl ParamsBuilder {
587    /// Consume this builder, creating [`Params`].
588    pub fn build(self) -> ::std::result::Result<crate::config::endpoint::Params, crate::config::endpoint::InvalidParams> {
589        if let Some(region) = &self.region {
590            if !crate::endpoint_lib::host::is_valid_host_label(
591                region.as_ref() as &str,
592                true,
593                &mut crate::endpoint_lib::diagnostic::DiagnosticCollector::new(),
594            ) {
595                return Err(crate::config::endpoint::InvalidParams::invalid_value(
596                    "region",
597                    "must be a valid host label",
598                ));
599            }
600        };
601        Ok(
602            #[allow(clippy::unnecessary_lazy_evaluations)]
603            crate::config::endpoint::Params {
604                region: self.region,
605                use_dual_stack: self
606                    .use_dual_stack
607                    .or_else(|| Some(false))
608                    .ok_or_else(|| crate::config::endpoint::InvalidParams::missing("use_dual_stack"))?,
609                use_fips: self
610                    .use_fips
611                    .or_else(|| Some(false))
612                    .ok_or_else(|| crate::config::endpoint::InvalidParams::missing("use_fips"))?,
613                endpoint: self.endpoint,
614            },
615        )
616    }
617    /// Sets the value for region
618    ///
619    /// The AWS region used to dispatch the request.
620    pub fn region(mut self, value: impl Into<::std::string::String>) -> Self {
621        self.region = Some(value.into());
622        self
623    }
624
625    /// Sets the value for region
626    ///
627    /// The AWS region used to dispatch the request.
628    pub fn set_region(mut self, param: Option<::std::string::String>) -> Self {
629        self.region = param;
630        self
631    }
632    /// Sets the value for use_dual_stack
633    ///
634    /// When unset, this parameter has a default value of `false`.
635    /// When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.
636    pub fn use_dual_stack(mut self, value: impl Into<bool>) -> Self {
637        self.use_dual_stack = Some(value.into());
638        self
639    }
640
641    /// Sets the value for use_dual_stack
642    ///
643    /// When unset, this parameter has a default value of `false`.
644    /// When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.
645    pub fn set_use_dual_stack(mut self, param: Option<bool>) -> Self {
646        self.use_dual_stack = param;
647        self
648    }
649    /// Sets the value for use_fips
650    ///
651    /// When unset, this parameter has a default value of `false`.
652    /// When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.
653    pub fn use_fips(mut self, value: impl Into<bool>) -> Self {
654        self.use_fips = Some(value.into());
655        self
656    }
657
658    /// Sets the value for use_fips
659    ///
660    /// When unset, this parameter has a default value of `false`.
661    /// When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.
662    pub fn set_use_fips(mut self, param: Option<bool>) -> Self {
663        self.use_fips = param;
664        self
665    }
666    /// Sets the value for endpoint
667    ///
668    /// Override the endpoint used to send this request
669    pub fn endpoint(mut self, value: impl Into<::std::string::String>) -> Self {
670        self.endpoint = Some(value.into());
671        self
672    }
673
674    /// Sets the value for endpoint
675    ///
676    /// Override the endpoint used to send this request
677    pub fn set_endpoint(mut self, param: Option<::std::string::String>) -> Self {
678        self.endpoint = param;
679        self
680    }
681}
682
683/// An error that occurred during endpoint resolution
684#[derive(Debug)]
685pub struct InvalidParams {
686    field: std::borrow::Cow<'static, str>,
687    kind: InvalidParamsErrorKind,
688}
689
690/// The kind of invalid parameter error
691#[derive(Debug)]
692enum InvalidParamsErrorKind {
693    MissingField,
694    InvalidValue { message: &'static str },
695}
696
697impl InvalidParams {
698    #[allow(dead_code)]
699    fn missing(field: &'static str) -> Self {
700        Self {
701            field: field.into(),
702            kind: InvalidParamsErrorKind::MissingField,
703        }
704    }
705
706    #[allow(dead_code)]
707    fn invalid_value(field: &'static str, message: &'static str) -> Self {
708        Self {
709            field: field.into(),
710            kind: InvalidParamsErrorKind::InvalidValue { message },
711        }
712    }
713}
714
715impl std::fmt::Display for InvalidParams {
716    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
717        match self.kind {
718            InvalidParamsErrorKind::MissingField => write!(f, "a required field was missing: `{}`", self.field),
719            InvalidParamsErrorKind::InvalidValue { message } => write!(f, "invalid value for field: `{}` - {}", self.field, message),
720        }
721    }
722}
723
724impl std::error::Error for InvalidParams {}
725
726mod internals;