1pub use ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver;
3 pub use ::aws_smithy_runtime_api::client::endpoint::EndpointFuture;
4 pub use ::aws_smithy_types::endpoint::Endpoint;
5
6#[derive(Debug, Default)]
8 pub(crate) struct EndpointOverrideFeatureTrackerInterceptor;
9
10 #[::aws_smithy_runtime_api::client::interceptors::dyn_dispatch_hint]
11 impl ::aws_smithy_runtime_api::client::interceptors::Intercept for EndpointOverrideFeatureTrackerInterceptor {
12 fn name(&self) -> &'static str {
13 "EndpointOverrideFeatureTrackerInterceptor"
14 }
15
16 fn read_before_execution(
17 &self,
18 _context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_>,
19 cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
20 ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
21 if cfg.load::<::aws_types::endpoint_config::EndpointUrl>().is_some() {
22 cfg.interceptor_state()
23 .store_append(::aws_runtime::sdk_feature::AwsSdkFeature::EndpointOverride);
24 }
25 ::std::result::Result::Ok(())
26 }
27 }
28
29#[cfg(test)]
30mod test {
31
32 #[test]
34 fn test_1() {
35 let params = crate::config::endpoint::Params::builder()
36 .endpoint("https://example.com".to_string())
37 .use_fips(false)
38 .build().expect("invalid params");
39 let resolver = crate::config::endpoint::DefaultResolver::new();
40 let endpoint = resolver.resolve_endpoint(¶ms);
41 let endpoint = endpoint.expect("Expected valid endpoint: https://example.com");
42 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://example.com")
43 .build());
44 }
45
46 #[test]
48 fn test_2() {
49 let params = crate::config::endpoint::Params::builder()
50 .endpoint("https://example.com".to_string())
51 .use_fips(true)
52 .build().expect("invalid params");
53 let resolver = crate::config::endpoint::DefaultResolver::new();
54 let endpoint = resolver.resolve_endpoint(¶ms);
55 let error = endpoint.expect_err("expected error: Invalid Configuration: FIPS and custom endpoint are not supported [For custom endpoint with fips enabled]");
56 assert_eq!(format!("{}", error), "Invalid Configuration: FIPS and custom endpoint are not supported")
57 }
58
59 #[test]
61 fn test_3() {
62 let params = crate::config::endpoint::Params::builder()
63 .endpoint("https://example.com".to_string())
64 .use_fips(false)
65 .use_dual_stack(true)
66 .build().expect("invalid params");
67 let resolver = crate::config::endpoint::DefaultResolver::new();
68 let endpoint = resolver.resolve_endpoint(¶ms);
69 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]");
70 assert_eq!(format!("{}", error), "Invalid Configuration: Dualstack and custom endpoint are not supported")
71 }
72
73 #[test]
75 fn test_4() {
76 let params = crate::config::endpoint::Params::builder()
77 .region("us-east-1".to_string())
78 .use_fips(true)
79 .use_dual_stack(true)
80 .build().expect("invalid params");
81 let resolver = crate::config::endpoint::DefaultResolver::new();
82 let endpoint = resolver.resolve_endpoint(¶ms);
83 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-east-1.api.aws");
84 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-east-1.api.aws")
85 .build());
86 }
87
88 #[test]
90 fn test_5() {
91 let params = crate::config::endpoint::Params::builder()
92 .region("us-east-1".to_string())
93 .use_fips(true)
94 .use_dual_stack(false)
95 .build().expect("invalid params");
96 let resolver = crate::config::endpoint::DefaultResolver::new();
97 let endpoint = resolver.resolve_endpoint(¶ms);
98 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-east-1.amazonaws.com");
99 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-east-1.amazonaws.com")
100 .build());
101 }
102
103 #[test]
105 fn test_6() {
106 let params = crate::config::endpoint::Params::builder()
107 .region("us-east-1".to_string())
108 .use_fips(false)
109 .use_dual_stack(true)
110 .build().expect("invalid params");
111 let resolver = crate::config::endpoint::DefaultResolver::new();
112 let endpoint = resolver.resolve_endpoint(¶ms);
113 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.us-east-1.api.aws");
114 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.us-east-1.api.aws")
115 .build());
116 }
117
118 #[test]
120 fn test_7() {
121 let params = crate::config::endpoint::Params::builder()
122 .region("us-east-1".to_string())
123 .use_fips(false)
124 .use_dual_stack(false)
125 .build().expect("invalid params");
126 let resolver = crate::config::endpoint::DefaultResolver::new();
127 let endpoint = resolver.resolve_endpoint(¶ms);
128 let endpoint = endpoint.expect("Expected valid endpoint: https://us-east-1.signin.aws.amazon.com");
129 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://us-east-1.signin.aws.amazon.com")
130 .build());
131 }
132
133 #[test]
135 fn test_8() {
136 let params = crate::config::endpoint::Params::builder()
137 .region("cn-northwest-1".to_string())
138 .use_fips(true)
139 .use_dual_stack(true)
140 .build().expect("invalid params");
141 let resolver = crate::config::endpoint::DefaultResolver::new();
142 let endpoint = resolver.resolve_endpoint(¶ms);
143 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.cn-northwest-1.api.amazonwebservices.com.cn");
144 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.cn-northwest-1.api.amazonwebservices.com.cn")
145 .build());
146 }
147
148 #[test]
150 fn test_9() {
151 let params = crate::config::endpoint::Params::builder()
152 .region("cn-northwest-1".to_string())
153 .use_fips(true)
154 .use_dual_stack(false)
155 .build().expect("invalid params");
156 let resolver = crate::config::endpoint::DefaultResolver::new();
157 let endpoint = resolver.resolve_endpoint(¶ms);
158 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.cn-northwest-1.amazonaws.com.cn");
159 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.cn-northwest-1.amazonaws.com.cn")
160 .build());
161 }
162
163 #[test]
165 fn test_10() {
166 let params = crate::config::endpoint::Params::builder()
167 .region("cn-northwest-1".to_string())
168 .use_fips(false)
169 .use_dual_stack(true)
170 .build().expect("invalid params");
171 let resolver = crate::config::endpoint::DefaultResolver::new();
172 let endpoint = resolver.resolve_endpoint(¶ms);
173 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.cn-northwest-1.api.amazonwebservices.com.cn");
174 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.cn-northwest-1.api.amazonwebservices.com.cn")
175 .build());
176 }
177
178 #[test]
180 fn test_11() {
181 let params = crate::config::endpoint::Params::builder()
182 .region("cn-northwest-1".to_string())
183 .use_fips(false)
184 .use_dual_stack(false)
185 .build().expect("invalid params");
186 let resolver = crate::config::endpoint::DefaultResolver::new();
187 let endpoint = resolver.resolve_endpoint(¶ms);
188 let endpoint = endpoint.expect("Expected valid endpoint: https://cn-northwest-1.signin.amazonaws.cn");
189 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://cn-northwest-1.signin.amazonaws.cn")
190 .build());
191 }
192
193 #[test]
195 fn test_12() {
196 let params = crate::config::endpoint::Params::builder()
197 .region("eusc-de-east-1".to_string())
198 .use_fips(true)
199 .use_dual_stack(false)
200 .build().expect("invalid params");
201 let resolver = crate::config::endpoint::DefaultResolver::new();
202 let endpoint = resolver.resolve_endpoint(¶ms);
203 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.eusc-de-east-1.amazonaws.eu");
204 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.eusc-de-east-1.amazonaws.eu")
205 .build());
206 }
207
208 #[test]
210 fn test_13() {
211 let params = crate::config::endpoint::Params::builder()
212 .region("eusc-de-east-1".to_string())
213 .use_fips(false)
214 .use_dual_stack(false)
215 .build().expect("invalid params");
216 let resolver = crate::config::endpoint::DefaultResolver::new();
217 let endpoint = resolver.resolve_endpoint(¶ms);
218 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.eusc-de-east-1.amazonaws.eu");
219 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.eusc-de-east-1.amazonaws.eu")
220 .build());
221 }
222
223 #[test]
225 fn test_14() {
226 let params = crate::config::endpoint::Params::builder()
227 .region("us-iso-east-1".to_string())
228 .use_fips(true)
229 .use_dual_stack(false)
230 .build().expect("invalid params");
231 let resolver = crate::config::endpoint::DefaultResolver::new();
232 let endpoint = resolver.resolve_endpoint(¶ms);
233 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-iso-east-1.c2s.ic.gov");
234 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-iso-east-1.c2s.ic.gov")
235 .build());
236 }
237
238 #[test]
240 fn test_15() {
241 let params = crate::config::endpoint::Params::builder()
242 .region("us-iso-east-1".to_string())
243 .use_fips(false)
244 .use_dual_stack(false)
245 .build().expect("invalid params");
246 let resolver = crate::config::endpoint::DefaultResolver::new();
247 let endpoint = resolver.resolve_endpoint(¶ms);
248 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.us-iso-east-1.c2s.ic.gov");
249 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.us-iso-east-1.c2s.ic.gov")
250 .build());
251 }
252
253 #[test]
255 fn test_16() {
256 let params = crate::config::endpoint::Params::builder()
257 .region("us-isob-east-1".to_string())
258 .use_fips(true)
259 .use_dual_stack(false)
260 .build().expect("invalid params");
261 let resolver = crate::config::endpoint::DefaultResolver::new();
262 let endpoint = resolver.resolve_endpoint(¶ms);
263 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-isob-east-1.sc2s.sgov.gov");
264 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-isob-east-1.sc2s.sgov.gov")
265 .build());
266 }
267
268 #[test]
270 fn test_17() {
271 let params = crate::config::endpoint::Params::builder()
272 .region("us-isob-east-1".to_string())
273 .use_fips(false)
274 .use_dual_stack(false)
275 .build().expect("invalid params");
276 let resolver = crate::config::endpoint::DefaultResolver::new();
277 let endpoint = resolver.resolve_endpoint(¶ms);
278 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.us-isob-east-1.sc2s.sgov.gov");
279 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.us-isob-east-1.sc2s.sgov.gov")
280 .build());
281 }
282
283 #[test]
285 fn test_18() {
286 let params = crate::config::endpoint::Params::builder()
287 .region("eu-isoe-west-1".to_string())
288 .use_fips(true)
289 .use_dual_stack(false)
290 .build().expect("invalid params");
291 let resolver = crate::config::endpoint::DefaultResolver::new();
292 let endpoint = resolver.resolve_endpoint(¶ms);
293 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.eu-isoe-west-1.cloud.adc-e.uk");
294 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.eu-isoe-west-1.cloud.adc-e.uk")
295 .build());
296 }
297
298 #[test]
300 fn test_19() {
301 let params = crate::config::endpoint::Params::builder()
302 .region("eu-isoe-west-1".to_string())
303 .use_fips(false)
304 .use_dual_stack(false)
305 .build().expect("invalid params");
306 let resolver = crate::config::endpoint::DefaultResolver::new();
307 let endpoint = resolver.resolve_endpoint(¶ms);
308 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.eu-isoe-west-1.cloud.adc-e.uk");
309 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.eu-isoe-west-1.cloud.adc-e.uk")
310 .build());
311 }
312
313 #[test]
315 fn test_20() {
316 let params = crate::config::endpoint::Params::builder()
317 .region("us-isof-south-1".to_string())
318 .use_fips(true)
319 .use_dual_stack(false)
320 .build().expect("invalid params");
321 let resolver = crate::config::endpoint::DefaultResolver::new();
322 let endpoint = resolver.resolve_endpoint(¶ms);
323 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-isof-south-1.csp.hci.ic.gov");
324 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-isof-south-1.csp.hci.ic.gov")
325 .build());
326 }
327
328 #[test]
330 fn test_21() {
331 let params = crate::config::endpoint::Params::builder()
332 .region("us-isof-south-1".to_string())
333 .use_fips(false)
334 .use_dual_stack(false)
335 .build().expect("invalid params");
336 let resolver = crate::config::endpoint::DefaultResolver::new();
337 let endpoint = resolver.resolve_endpoint(¶ms);
338 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.us-isof-south-1.csp.hci.ic.gov");
339 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.us-isof-south-1.csp.hci.ic.gov")
340 .build());
341 }
342
343 #[test]
345 fn test_22() {
346 let params = crate::config::endpoint::Params::builder()
347 .region("us-gov-west-1".to_string())
348 .use_fips(true)
349 .use_dual_stack(true)
350 .build().expect("invalid params");
351 let resolver = crate::config::endpoint::DefaultResolver::new();
352 let endpoint = resolver.resolve_endpoint(¶ms);
353 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-gov-west-1.api.aws");
354 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-gov-west-1.api.aws")
355 .build());
356 }
357
358 #[test]
360 fn test_23() {
361 let params = crate::config::endpoint::Params::builder()
362 .region("us-gov-west-1".to_string())
363 .use_fips(true)
364 .use_dual_stack(false)
365 .build().expect("invalid params");
366 let resolver = crate::config::endpoint::DefaultResolver::new();
367 let endpoint = resolver.resolve_endpoint(¶ms);
368 let endpoint = endpoint.expect("Expected valid endpoint: https://signin-fips.us-gov-west-1.amazonaws.com");
369 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin-fips.us-gov-west-1.amazonaws.com")
370 .build());
371 }
372
373 #[test]
375 fn test_24() {
376 let params = crate::config::endpoint::Params::builder()
377 .region("us-gov-west-1".to_string())
378 .use_fips(false)
379 .use_dual_stack(true)
380 .build().expect("invalid params");
381 let resolver = crate::config::endpoint::DefaultResolver::new();
382 let endpoint = resolver.resolve_endpoint(¶ms);
383 let endpoint = endpoint.expect("Expected valid endpoint: https://signin.us-gov-west-1.api.aws");
384 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://signin.us-gov-west-1.api.aws")
385 .build());
386 }
387
388 #[test]
390 fn test_25() {
391 let params = crate::config::endpoint::Params::builder()
392 .region("us-gov-west-1".to_string())
393 .use_fips(false)
394 .use_dual_stack(false)
395 .build().expect("invalid params");
396 let resolver = crate::config::endpoint::DefaultResolver::new();
397 let endpoint = resolver.resolve_endpoint(¶ms);
398 let endpoint = endpoint.expect("Expected valid endpoint: https://us-gov-west-1.signin.amazonaws-us-gov.com");
399 assert_eq!(endpoint, ::aws_smithy_types::endpoint::Endpoint::builder().url("https://us-gov-west-1.signin.amazonaws-us-gov.com")
400 .build());
401 }
402
403 #[test]
405 fn test_26() {
406 let params = crate::config::endpoint::Params::builder()
407 .build().expect("invalid params");
408 let resolver = crate::config::endpoint::DefaultResolver::new();
409 let endpoint = resolver.resolve_endpoint(¶ms);
410 let error = endpoint.expect_err("expected error: Invalid Configuration: Missing Region [Missing region]");
411 assert_eq!(format!("{}", error), "Invalid Configuration: Missing Region")
412 }
413
414
415}
416
417pub trait ResolveEndpoint: ::std::marker::Send + ::std::marker::Sync + ::std::fmt::Debug {
419 fn resolve_endpoint<'a>(&'a self, params: &'a crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a>;
421
422 fn into_shared_resolver(self) -> ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver
426 where
427 Self: Sized + 'static,
428 {
429 ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver::new(DowncastParams(self))
430 }
431 }
432
433 #[derive(Debug)]
434 struct DowncastParams<T>(T);
435 impl<T> ::aws_smithy_runtime_api::client::endpoint::ResolveEndpoint for DowncastParams<T>
436 where
437 T: ResolveEndpoint,
438 {
439 fn resolve_endpoint<'a>(&'a self, params: &'a ::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a> {
440 let ep = match params.get::<crate::config::endpoint::Params>() {
441 Some(params) => self.0.resolve_endpoint(params),
442 None => ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(Err("params of expected type was not present".into())),
443 };
444 ep
445 }
446
447 }
448
449#[derive(Debug, Default)]
451 pub struct DefaultResolver {
452 partition_resolver: crate::endpoint_lib::partition::PartitionResolver
453 }
454
455 impl DefaultResolver {
456 pub fn new() -> Self {
458 Self { partition_resolver: crate::endpoint_lib::DEFAULT_PARTITION_RESOLVER.clone() }
459 }
460
461 fn resolve_endpoint(&self, params: &crate::config::endpoint::Params) -> ::std::result::Result<::aws_smithy_types::endpoint::Endpoint, ::aws_smithy_runtime_api::box_error::BoxError> {
462 let mut diagnostic_collector = crate::endpoint_lib::diagnostic::DiagnosticCollector::new();
463 Ok(crate::config::endpoint::internals::resolve_endpoint(params, &mut diagnostic_collector, &self.partition_resolver)
464 .map_err(|err|err.with_source(diagnostic_collector.take_last_error()))?)
465 }
466 }
467
468 impl crate::config::endpoint::ResolveEndpoint for DefaultResolver {
469 fn resolve_endpoint(&self, params: &crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'_> {
470 ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(self.resolve_endpoint(params))
471 }
472 }
473
474#[non_exhaustive]
475#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
476pub struct Params {
478 pub(crate) use_dual_stack: bool,
480 pub(crate) use_fips: bool,
482 pub(crate) endpoint: ::std::option::Option<::std::string::String>,
484 pub(crate) region: ::std::option::Option<::std::string::String>,
486}
487impl Params {
488 pub fn builder() -> crate::config::endpoint::ParamsBuilder {
490 crate::config::endpoint::ParamsBuilder::default()
491 }
492 pub fn use_dual_stack(&self) -> ::std::option::Option<bool> {
494 Some(self.use_dual_stack)
495 }
496 pub fn use_fips(&self) -> ::std::option::Option<bool> {
498 Some(self.use_fips)
499 }
500 pub fn endpoint(&self) -> ::std::option::Option<&str> {
502 self.endpoint.as_deref()
503 }
504 pub fn region(&self) -> ::std::option::Option<&str> {
506 self.region.as_deref()
507 }
508}
509
510#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::default::Default, ::std::fmt::Debug)]
512pub struct ParamsBuilder {
513 use_dual_stack: ::std::option::Option<bool>,
514 use_fips: ::std::option::Option<bool>,
515 endpoint: ::std::option::Option<::std::string::String>,
516 region: ::std::option::Option<::std::string::String>,
517}
518impl ParamsBuilder {
519 pub fn build(self) -> ::std::result::Result<crate::config::endpoint::Params, crate::config::endpoint::InvalidParams> {
521 if let Some(region) = &self.region {
522 if !crate::endpoint_lib::host::is_valid_host_label(region.as_ref() as &str, true, &mut crate::endpoint_lib::diagnostic::DiagnosticCollector::new()) {
523 return Err(crate::config::endpoint::InvalidParams::invalid_value("region", "must be a valid host label"))
524 }
525 };
526 Ok(#[allow(clippy::unnecessary_lazy_evaluations)]
527 crate::config::endpoint::Params {
528 use_dual_stack: self.use_dual_stack
529 .or_else(||Some(false))
530 .ok_or_else(||crate::config::endpoint::InvalidParams::missing("use_dual_stack"))?
531 ,
532 use_fips: self.use_fips
533 .or_else(||Some(false))
534 .ok_or_else(||crate::config::endpoint::InvalidParams::missing("use_fips"))?
535 ,
536 endpoint: self.endpoint
537 ,
538 region: self.region
539 ,
540 })
541 }
542 pub fn use_dual_stack(mut self, value: impl Into<bool>) -> Self {
547 self.use_dual_stack = Some(value.into());
548 self
549 }
550
551 pub fn set_use_dual_stack(mut self, param: Option<bool>) -> Self {
556 self.use_dual_stack = param;
557 self
558 }
559 pub fn use_fips(mut self, value: impl Into<bool>) -> Self {
564 self.use_fips = Some(value.into());
565 self
566 }
567
568 pub fn set_use_fips(mut self, param: Option<bool>) -> Self {
573 self.use_fips = param;
574 self
575 }
576 pub fn endpoint(mut self, value: impl Into<::std::string::String>) -> Self {
580 self.endpoint = Some(value.into());
581 self
582 }
583
584 pub fn set_endpoint(mut self, param: Option<::std::string::String>) -> Self {
588 self.endpoint = param;
589 self
590 }
591 pub fn region(mut self, value: impl Into<::std::string::String>) -> Self {
595 self.region = Some(value.into());
596 self
597 }
598
599 pub fn set_region(mut self, param: Option<::std::string::String>) -> Self {
603 self.region = param;
604 self
605 }
606}
607
608#[derive(Debug)]
610 pub struct InvalidParams {
611 field: std::borrow::Cow<'static, str>,
612 kind: InvalidParamsErrorKind,
613 }
614
615 #[derive(Debug)]
617 enum InvalidParamsErrorKind {
618 MissingField,
619 InvalidValue {
620 message: &'static str,
621 }
622 }
623
624 impl InvalidParams {
625 #[allow(dead_code)]
626 fn missing(field: &'static str) -> Self {
627 Self { field: field.into(), kind: InvalidParamsErrorKind::MissingField }
628 }
629
630 #[allow(dead_code)]
631 fn invalid_value(field: &'static str, message: &'static str) -> Self {
632 Self { field: field.into(), kind: InvalidParamsErrorKind::InvalidValue { message }}
633 }
634 }
635
636 impl std::fmt::Display for InvalidParams {
637 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
638 match self.kind {
639 InvalidParamsErrorKind::MissingField => write!(f, "a required field was missing: `{}`", self.field),
640 InvalidParamsErrorKind::InvalidValue { message} => write!(f, "invalid value for field: `{}` - {}", self.field, message),
641 }
642 }
643 }
644
645 impl std::error::Error for InvalidParams { }
646
647mod internals;
648