1pub 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#[derive(Debug, Default)]
8pub(crate) struct EndpointOverrideFeatureTrackerInterceptor;
9
10#[::aws_smithy_runtime_api::client::interceptors::dyn_dispatch_hint]
11impl ::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()
39 .expect("invalid params");
40 let resolver = crate::config::endpoint::DefaultResolver::new();
41 let endpoint = resolver.resolve_endpoint(¶ms);
42 let endpoint = endpoint.expect("Expected valid endpoint: https://example.com");
43 assert_eq!(
44 endpoint,
45 ::aws_smithy_types::endpoint::Endpoint::builder().url("https://example.com").build()
46 );
47 }
48
49 #[test]
51 fn test_2() {
52 let params = crate::config::endpoint::Params::builder()
53 .endpoint("https://example.com".to_string())
54 .use_fips(true)
55 .build()
56 .expect("invalid params");
57 let resolver = crate::config::endpoint::DefaultResolver::new();
58 let endpoint = resolver.resolve_endpoint(¶ms);
59 let error = endpoint
60 .expect_err("expected error: Invalid Configuration: FIPS and custom endpoint are not supported [For custom endpoint with fips enabled]");
61 assert_eq!(format!("{}", error), "Invalid Configuration: FIPS and custom endpoint are not supported")
62 }
63
64 #[test]
66 fn test_3() {
67 let params = crate::config::endpoint::Params::builder()
68 .endpoint("https://example.com".to_string())
69 .use_fips(false)
70 .use_dual_stack(true)
71 .build()
72 .expect("invalid params");
73 let resolver = crate::config::endpoint::DefaultResolver::new();
74 let endpoint = resolver.resolve_endpoint(¶ms);
75 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]");
76 assert_eq!(
77 format!("{}", error),
78 "Invalid Configuration: Dualstack and custom endpoint are not supported"
79 )
80 }
81
82 #[test]
84 fn test_4() {
85 let params = crate::config::endpoint::Params::builder()
86 .region("us-east-1".to_string())
87 .use_fips(true)
88 .use_dual_stack(true)
89 .build()
90 .expect("invalid params");
91 let resolver = crate::config::endpoint::DefaultResolver::new();
92 let endpoint = resolver.resolve_endpoint(¶ms);
93 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.us-west-2.api.aws");
94 assert_eq!(
95 endpoint,
96 ::aws_smithy_types::endpoint::Endpoint::builder()
97 .url("https://networkmanager-fips.us-west-2.api.aws")
98 .auth_scheme(
99 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-west-2".to_string())
100 )
101 .build()
102 );
103 }
104
105 #[test]
107 fn test_5() {
108 let params = crate::config::endpoint::Params::builder()
109 .region("us-east-1".to_string())
110 .use_fips(true)
111 .use_dual_stack(false)
112 .build()
113 .expect("invalid params");
114 let resolver = crate::config::endpoint::DefaultResolver::new();
115 let endpoint = resolver.resolve_endpoint(¶ms);
116 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.us-west-2.amazonaws.com");
117 assert_eq!(
118 endpoint,
119 ::aws_smithy_types::endpoint::Endpoint::builder()
120 .url("https://networkmanager-fips.us-west-2.amazonaws.com")
121 .auth_scheme(
122 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-west-2".to_string())
123 )
124 .build()
125 );
126 }
127
128 #[test]
130 fn test_6() {
131 let params = crate::config::endpoint::Params::builder()
132 .region("us-east-1".to_string())
133 .use_fips(false)
134 .use_dual_stack(true)
135 .build()
136 .expect("invalid params");
137 let resolver = crate::config::endpoint::DefaultResolver::new();
138 let endpoint = resolver.resolve_endpoint(¶ms);
139 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-west-2.api.aws");
140 assert_eq!(
141 endpoint,
142 ::aws_smithy_types::endpoint::Endpoint::builder()
143 .url("https://networkmanager.us-west-2.api.aws")
144 .auth_scheme(
145 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-west-2".to_string())
146 )
147 .build()
148 );
149 }
150
151 #[test]
153 fn test_7() {
154 let params = crate::config::endpoint::Params::builder()
155 .region("us-east-1".to_string())
156 .use_fips(false)
157 .use_dual_stack(false)
158 .build()
159 .expect("invalid params");
160 let resolver = crate::config::endpoint::DefaultResolver::new();
161 let endpoint = resolver.resolve_endpoint(¶ms);
162 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-west-2.amazonaws.com");
163 assert_eq!(
164 endpoint,
165 ::aws_smithy_types::endpoint::Endpoint::builder()
166 .url("https://networkmanager.us-west-2.amazonaws.com")
167 .auth_scheme(
168 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-west-2".to_string())
169 )
170 .build()
171 );
172 }
173
174 #[test]
176 fn test_8() {
177 let params = crate::config::endpoint::Params::builder()
178 .region("cn-northwest-1".to_string())
179 .use_fips(true)
180 .use_dual_stack(true)
181 .build()
182 .expect("invalid params");
183 let resolver = crate::config::endpoint::DefaultResolver::new();
184 let endpoint = resolver.resolve_endpoint(¶ms);
185 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.cn-northwest-1.api.amazonwebservices.com.cn");
186 assert_eq!(
187 endpoint,
188 ::aws_smithy_types::endpoint::Endpoint::builder()
189 .url("https://networkmanager-fips.cn-northwest-1.api.amazonwebservices.com.cn")
190 .auth_scheme(
191 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "cn-northwest-1".to_string())
192 )
193 .build()
194 );
195 }
196
197 #[test]
199 fn test_9() {
200 let params = crate::config::endpoint::Params::builder()
201 .region("cn-northwest-1".to_string())
202 .use_fips(true)
203 .use_dual_stack(false)
204 .build()
205 .expect("invalid params");
206 let resolver = crate::config::endpoint::DefaultResolver::new();
207 let endpoint = resolver.resolve_endpoint(¶ms);
208 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.cn-northwest-1.amazonaws.com.cn");
209 assert_eq!(
210 endpoint,
211 ::aws_smithy_types::endpoint::Endpoint::builder()
212 .url("https://networkmanager-fips.cn-northwest-1.amazonaws.com.cn")
213 .auth_scheme(
214 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "cn-northwest-1".to_string())
215 )
216 .build()
217 );
218 }
219
220 #[test]
222 fn test_10() {
223 let params = crate::config::endpoint::Params::builder()
224 .region("cn-northwest-1".to_string())
225 .use_fips(false)
226 .use_dual_stack(true)
227 .build()
228 .expect("invalid params");
229 let resolver = crate::config::endpoint::DefaultResolver::new();
230 let endpoint = resolver.resolve_endpoint(¶ms);
231 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.cn-northwest-1.api.amazonwebservices.com.cn");
232 assert_eq!(
233 endpoint,
234 ::aws_smithy_types::endpoint::Endpoint::builder()
235 .url("https://networkmanager.cn-northwest-1.api.amazonwebservices.com.cn")
236 .auth_scheme(
237 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "cn-northwest-1".to_string())
238 )
239 .build()
240 );
241 }
242
243 #[test]
245 fn test_11() {
246 let params = crate::config::endpoint::Params::builder()
247 .region("cn-northwest-1".to_string())
248 .use_fips(false)
249 .use_dual_stack(false)
250 .build()
251 .expect("invalid params");
252 let resolver = crate::config::endpoint::DefaultResolver::new();
253 let endpoint = resolver.resolve_endpoint(¶ms);
254 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.cn-northwest-1.amazonaws.com.cn");
255 assert_eq!(
256 endpoint,
257 ::aws_smithy_types::endpoint::Endpoint::builder()
258 .url("https://networkmanager.cn-northwest-1.amazonaws.com.cn")
259 .auth_scheme(
260 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "cn-northwest-1".to_string())
261 )
262 .build()
263 );
264 }
265
266 #[test]
268 fn test_12() {
269 let params = crate::config::endpoint::Params::builder()
270 .region("eusc-de-east-1".to_string())
271 .use_fips(true)
272 .use_dual_stack(false)
273 .build()
274 .expect("invalid params");
275 let resolver = crate::config::endpoint::DefaultResolver::new();
276 let endpoint = resolver.resolve_endpoint(¶ms);
277 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.eusc-de-east-1.amazonaws.eu");
278 assert_eq!(
279 endpoint,
280 ::aws_smithy_types::endpoint::Endpoint::builder()
281 .url("https://networkmanager-fips.eusc-de-east-1.amazonaws.eu")
282 .auth_scheme(
283 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "eusc-de-east-1".to_string())
284 )
285 .build()
286 );
287 }
288
289 #[test]
291 fn test_13() {
292 let params = crate::config::endpoint::Params::builder()
293 .region("eusc-de-east-1".to_string())
294 .use_fips(false)
295 .use_dual_stack(false)
296 .build()
297 .expect("invalid params");
298 let resolver = crate::config::endpoint::DefaultResolver::new();
299 let endpoint = resolver.resolve_endpoint(¶ms);
300 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.eusc-de-east-1.amazonaws.eu");
301 assert_eq!(
302 endpoint,
303 ::aws_smithy_types::endpoint::Endpoint::builder()
304 .url("https://networkmanager.eusc-de-east-1.amazonaws.eu")
305 .auth_scheme(
306 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "eusc-de-east-1".to_string())
307 )
308 .build()
309 );
310 }
311
312 #[test]
314 fn test_14() {
315 let params = crate::config::endpoint::Params::builder()
316 .region("us-iso-east-1".to_string())
317 .use_fips(true)
318 .use_dual_stack(false)
319 .build()
320 .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://networkmanager-fips.us-iso-east-1.c2s.ic.gov");
324 assert_eq!(
325 endpoint,
326 ::aws_smithy_types::endpoint::Endpoint::builder()
327 .url("https://networkmanager-fips.us-iso-east-1.c2s.ic.gov")
328 .auth_scheme(
329 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-iso-east-1".to_string())
330 )
331 .build()
332 );
333 }
334
335 #[test]
337 fn test_15() {
338 let params = crate::config::endpoint::Params::builder()
339 .region("us-iso-east-1".to_string())
340 .use_fips(false)
341 .use_dual_stack(false)
342 .build()
343 .expect("invalid params");
344 let resolver = crate::config::endpoint::DefaultResolver::new();
345 let endpoint = resolver.resolve_endpoint(¶ms);
346 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-iso-east-1.c2s.ic.gov");
347 assert_eq!(
348 endpoint,
349 ::aws_smithy_types::endpoint::Endpoint::builder()
350 .url("https://networkmanager.us-iso-east-1.c2s.ic.gov")
351 .auth_scheme(
352 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-iso-east-1".to_string())
353 )
354 .build()
355 );
356 }
357
358 #[test]
360 fn test_16() {
361 let params = crate::config::endpoint::Params::builder()
362 .region("us-isob-east-1".to_string())
363 .use_fips(true)
364 .use_dual_stack(false)
365 .build()
366 .expect("invalid params");
367 let resolver = crate::config::endpoint::DefaultResolver::new();
368 let endpoint = resolver.resolve_endpoint(¶ms);
369 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.us-isob-east-1.sc2s.sgov.gov");
370 assert_eq!(
371 endpoint,
372 ::aws_smithy_types::endpoint::Endpoint::builder()
373 .url("https://networkmanager-fips.us-isob-east-1.sc2s.sgov.gov")
374 .auth_scheme(
375 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-isob-east-1".to_string())
376 )
377 .build()
378 );
379 }
380
381 #[test]
383 fn test_17() {
384 let params = crate::config::endpoint::Params::builder()
385 .region("us-isob-east-1".to_string())
386 .use_fips(false)
387 .use_dual_stack(false)
388 .build()
389 .expect("invalid params");
390 let resolver = crate::config::endpoint::DefaultResolver::new();
391 let endpoint = resolver.resolve_endpoint(¶ms);
392 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-isob-east-1.sc2s.sgov.gov");
393 assert_eq!(
394 endpoint,
395 ::aws_smithy_types::endpoint::Endpoint::builder()
396 .url("https://networkmanager.us-isob-east-1.sc2s.sgov.gov")
397 .auth_scheme(
398 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-isob-east-1".to_string())
399 )
400 .build()
401 );
402 }
403
404 #[test]
406 fn test_18() {
407 let params = crate::config::endpoint::Params::builder()
408 .region("eu-isoe-west-1".to_string())
409 .use_fips(true)
410 .use_dual_stack(false)
411 .build()
412 .expect("invalid params");
413 let resolver = crate::config::endpoint::DefaultResolver::new();
414 let endpoint = resolver.resolve_endpoint(¶ms);
415 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.eu-isoe-west-1.cloud.adc-e.uk");
416 assert_eq!(
417 endpoint,
418 ::aws_smithy_types::endpoint::Endpoint::builder()
419 .url("https://networkmanager-fips.eu-isoe-west-1.cloud.adc-e.uk")
420 .auth_scheme(
421 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "eu-isoe-west-1".to_string())
422 )
423 .build()
424 );
425 }
426
427 #[test]
429 fn test_19() {
430 let params = crate::config::endpoint::Params::builder()
431 .region("eu-isoe-west-1".to_string())
432 .use_fips(false)
433 .use_dual_stack(false)
434 .build()
435 .expect("invalid params");
436 let resolver = crate::config::endpoint::DefaultResolver::new();
437 let endpoint = resolver.resolve_endpoint(¶ms);
438 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.eu-isoe-west-1.cloud.adc-e.uk");
439 assert_eq!(
440 endpoint,
441 ::aws_smithy_types::endpoint::Endpoint::builder()
442 .url("https://networkmanager.eu-isoe-west-1.cloud.adc-e.uk")
443 .auth_scheme(
444 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "eu-isoe-west-1".to_string())
445 )
446 .build()
447 );
448 }
449
450 #[test]
452 fn test_20() {
453 let params = crate::config::endpoint::Params::builder()
454 .region("us-isof-south-1".to_string())
455 .use_fips(true)
456 .use_dual_stack(false)
457 .build()
458 .expect("invalid params");
459 let resolver = crate::config::endpoint::DefaultResolver::new();
460 let endpoint = resolver.resolve_endpoint(¶ms);
461 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager-fips.us-isof-south-1.csp.hci.ic.gov");
462 assert_eq!(
463 endpoint,
464 ::aws_smithy_types::endpoint::Endpoint::builder()
465 .url("https://networkmanager-fips.us-isof-south-1.csp.hci.ic.gov")
466 .auth_scheme(
467 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-isof-south-1".to_string())
468 )
469 .build()
470 );
471 }
472
473 #[test]
475 fn test_21() {
476 let params = crate::config::endpoint::Params::builder()
477 .region("us-isof-south-1".to_string())
478 .use_fips(false)
479 .use_dual_stack(false)
480 .build()
481 .expect("invalid params");
482 let resolver = crate::config::endpoint::DefaultResolver::new();
483 let endpoint = resolver.resolve_endpoint(¶ms);
484 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-isof-south-1.csp.hci.ic.gov");
485 assert_eq!(
486 endpoint,
487 ::aws_smithy_types::endpoint::Endpoint::builder()
488 .url("https://networkmanager.us-isof-south-1.csp.hci.ic.gov")
489 .auth_scheme(
490 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-isof-south-1".to_string())
491 )
492 .build()
493 );
494 }
495
496 #[test]
498 fn test_22() {
499 let params = crate::config::endpoint::Params::builder()
500 .region("us-gov-west-1".to_string())
501 .use_fips(true)
502 .use_dual_stack(true)
503 .build()
504 .expect("invalid params");
505 let resolver = crate::config::endpoint::DefaultResolver::new();
506 let endpoint = resolver.resolve_endpoint(¶ms);
507 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-gov-west-1.api.aws");
508 assert_eq!(
509 endpoint,
510 ::aws_smithy_types::endpoint::Endpoint::builder()
511 .url("https://networkmanager.us-gov-west-1.api.aws")
512 .auth_scheme(
513 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-gov-west-1".to_string())
514 )
515 .build()
516 );
517 }
518
519 #[test]
521 fn test_23() {
522 let params = crate::config::endpoint::Params::builder()
523 .region("us-gov-west-1".to_string())
524 .use_fips(true)
525 .use_dual_stack(false)
526 .build()
527 .expect("invalid params");
528 let resolver = crate::config::endpoint::DefaultResolver::new();
529 let endpoint = resolver.resolve_endpoint(¶ms);
530 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-gov-west-1.amazonaws.com");
531 assert_eq!(
532 endpoint,
533 ::aws_smithy_types::endpoint::Endpoint::builder()
534 .url("https://networkmanager.us-gov-west-1.amazonaws.com")
535 .auth_scheme(
536 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-gov-west-1".to_string())
537 )
538 .build()
539 );
540 }
541
542 #[test]
544 fn test_24() {
545 let params = crate::config::endpoint::Params::builder()
546 .region("us-gov-west-1".to_string())
547 .use_fips(false)
548 .use_dual_stack(true)
549 .build()
550 .expect("invalid params");
551 let resolver = crate::config::endpoint::DefaultResolver::new();
552 let endpoint = resolver.resolve_endpoint(¶ms);
553 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-gov-west-1.api.aws");
554 assert_eq!(
555 endpoint,
556 ::aws_smithy_types::endpoint::Endpoint::builder()
557 .url("https://networkmanager.us-gov-west-1.api.aws")
558 .auth_scheme(
559 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-gov-west-1".to_string())
560 )
561 .build()
562 );
563 }
564
565 #[test]
567 fn test_25() {
568 let params = crate::config::endpoint::Params::builder()
569 .region("us-gov-west-1".to_string())
570 .use_fips(false)
571 .use_dual_stack(false)
572 .build()
573 .expect("invalid params");
574 let resolver = crate::config::endpoint::DefaultResolver::new();
575 let endpoint = resolver.resolve_endpoint(¶ms);
576 let endpoint = endpoint.expect("Expected valid endpoint: https://networkmanager.us-gov-west-1.amazonaws.com");
577 assert_eq!(
578 endpoint,
579 ::aws_smithy_types::endpoint::Endpoint::builder()
580 .url("https://networkmanager.us-gov-west-1.amazonaws.com")
581 .auth_scheme(
582 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4", 1).put("signingRegion", "us-gov-west-1".to_string())
583 )
584 .build()
585 );
586 }
587
588 #[test]
590 fn test_26() {
591 let params = crate::config::endpoint::Params::builder().build().expect("invalid params");
592 let resolver = crate::config::endpoint::DefaultResolver::new();
593 let endpoint = resolver.resolve_endpoint(¶ms);
594 let error = endpoint.expect_err("expected error: Invalid Configuration: Missing Region [Missing region]");
595 assert_eq!(format!("{}", error), "Invalid Configuration: Missing Region")
596 }
597}
598
599pub trait ResolveEndpoint: ::std::marker::Send + ::std::marker::Sync + ::std::fmt::Debug {
601 fn resolve_endpoint<'a>(&'a self, params: &'a crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a>;
603
604 fn into_shared_resolver(self) -> ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver
608 where
609 Self: Sized + 'static,
610 {
611 ::aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver::new(DowncastParams(self))
612 }
613}
614
615#[derive(Debug)]
616struct DowncastParams<T>(T);
617impl<T> ::aws_smithy_runtime_api::client::endpoint::ResolveEndpoint for DowncastParams<T>
618where
619 T: ResolveEndpoint,
620{
621 fn resolve_endpoint<'a>(
622 &'a self,
623 params: &'a ::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams,
624 ) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a> {
625 let ep = match params.get::<crate::config::endpoint::Params>() {
626 Some(params) => self.0.resolve_endpoint(params),
627 None => ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(Err("params of expected type was not present".into())),
628 };
629 ep
630 }
631}
632
633#[derive(Debug)]
634pub struct DefaultResolver {
636 partition_resolver: &'static crate::endpoint_lib::partition::PartitionResolver,
637 endpoint_cache: ::arc_swap::ArcSwap<::std::option::Option<(Params, ::aws_smithy_types::endpoint::Endpoint)>>,
638}
639
640impl Default for DefaultResolver {
641 fn default() -> Self {
642 Self::new()
643 }
644}
645
646impl DefaultResolver {
647 pub fn new() -> Self {
649 Self {
650 partition_resolver: &crate::endpoint_lib::DEFAULT_PARTITION_RESOLVER,
651 endpoint_cache: ::arc_swap::ArcSwap::from_pointee(None),
652 }
653 }
654
655 #[allow(
656 unused_variables,
657 unused_parens,
658 clippy::double_parens,
659 clippy::useless_conversion,
660 clippy::bool_comparison,
661 clippy::comparison_to_empty,
662 clippy::needless_borrow,
663 clippy::useless_asref,
664 clippy::redundant_closure_call,
665 clippy::clone_on_copy,
666 clippy::single_char_add_str
667 )]
668 fn resolve_endpoint<'a>(
669 &'a self,
670 params: &'a crate::config::endpoint::Params,
671 ) -> ::std::result::Result<::aws_smithy_types::endpoint::Endpoint, ::aws_smithy_runtime_api::box_error::BoxError> {
672 let mut _diagnostic_collector = crate::endpoint_lib::diagnostic::DiagnosticCollector::new();
673 #[allow(unused_mut)]
674 let mut context = ConditionContext::default();
675
676 let use_dual_stack = ¶ms.use_dual_stack;
678 let use_fips = ¶ms.use_fips;
679 let endpoint = ¶ms.endpoint;
680 let region = ¶ms.region;
681
682 let mut current_ref: i32 = 2;
683 loop {
684 match current_ref {
685 ref_val if ref_val >= 100_000_000 => {
686 return match (ref_val - 100_000_000) as usize {
687 0 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
688 "No endpoint rule matched",
689 )) as ::aws_smithy_runtime_api::box_error::BoxError),
690 1 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
691 "Invalid Configuration: FIPS and custom endpoint are not supported".to_string(),
692 )) as ::aws_smithy_runtime_api::box_error::BoxError),
693 2 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
694 "Invalid Configuration: Dualstack and custom endpoint are not supported".to_string(),
695 )) as ::aws_smithy_runtime_api::box_error::BoxError),
696 3 => {
697 let endpoint = params.endpoint.as_deref().unwrap_or_default();
698 ::std::result::Result::Ok(::aws_smithy_types::endpoint::Endpoint::builder().url(endpoint.to_owned()).build())
699 }
700 4 => ::std::result::Result::Ok(
701 ::aws_smithy_types::endpoint::Endpoint::builder()
702 .url("https://networkmanager.us-west-2.amazonaws.com".to_string())
703 .auth_scheme(
704 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
705 .put("signingRegion", "us-west-2"),
706 )
707 .build(),
708 ),
709 5 => ::std::result::Result::Ok(
710 ::aws_smithy_types::endpoint::Endpoint::builder()
711 .url("https://networkmanager.us-west-2.api.aws".to_string())
712 .auth_scheme(
713 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
714 .put("signingRegion", "us-west-2"),
715 )
716 .build(),
717 ),
718 6 => ::std::result::Result::Ok(
719 ::aws_smithy_types::endpoint::Endpoint::builder()
720 .url("https://networkmanager-fips.us-west-2.amazonaws.com".to_string())
721 .auth_scheme(
722 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
723 .put("signingRegion", "us-west-2"),
724 )
725 .build(),
726 ),
727 7 => ::std::result::Result::Ok(
728 ::aws_smithy_types::endpoint::Endpoint::builder()
729 .url("https://networkmanager-fips.us-west-2.api.aws".to_string())
730 .auth_scheme(
731 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
732 .put("signingRegion", "us-west-2"),
733 )
734 .build(),
735 ),
736 8 => ::std::result::Result::Ok(
737 ::aws_smithy_types::endpoint::Endpoint::builder()
738 .url("https://networkmanager.us-gov-west-1.amazonaws.com".to_string())
739 .auth_scheme(
740 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
741 .put("signingRegion", "us-gov-west-1"),
742 )
743 .build(),
744 ),
745 9 => ::std::result::Result::Ok(
746 ::aws_smithy_types::endpoint::Endpoint::builder()
747 .url("https://networkmanager.us-gov-west-1.api.aws".to_string())
748 .auth_scheme(
749 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
750 .put("signingRegion", "us-gov-west-1"),
751 )
752 .build(),
753 ),
754 10 => {
755 let partition_result = context.partition_result.as_ref().expect("Guaranteed to have a value by earlier checks.");
756 ::std::result::Result::Ok(
757 ::aws_smithy_types::endpoint::Endpoint::builder()
758 .url({
759 let mut out = String::new();
760 out.push_str("https://networkmanager-fips.");
761 #[allow(clippy::needless_borrow)]
762 out.push_str(&partition_result.implicit_global_region());
763 out.push_str(".");
764 #[allow(clippy::needless_borrow)]
765 out.push_str(&partition_result.dual_stack_dns_suffix());
766 out
767 })
768 .auth_scheme(
769 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
770 .put("signingRegion", partition_result.implicit_global_region()),
771 )
772 .build(),
773 )
774 }
775 11 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
776 "FIPS and DualStack are enabled, but this partition does not support one or both".to_string(),
777 )) as ::aws_smithy_runtime_api::box_error::BoxError),
778 12 => {
779 let partition_result = context.partition_result.as_ref().expect("Guaranteed to have a value by earlier checks.");
780 ::std::result::Result::Ok(
781 ::aws_smithy_types::endpoint::Endpoint::builder()
782 .url({
783 let mut out = String::new();
784 out.push_str("https://networkmanager-fips.");
785 #[allow(clippy::needless_borrow)]
786 out.push_str(&partition_result.implicit_global_region());
787 out.push_str(".");
788 #[allow(clippy::needless_borrow)]
789 out.push_str(&partition_result.dns_suffix());
790 out
791 })
792 .auth_scheme(
793 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
794 .put("signingRegion", partition_result.implicit_global_region()),
795 )
796 .build(),
797 )
798 }
799 13 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
800 "FIPS is enabled but this partition does not support FIPS".to_string(),
801 )) as ::aws_smithy_runtime_api::box_error::BoxError),
802 14 => {
803 let partition_result = context.partition_result.as_ref().expect("Guaranteed to have a value by earlier checks.");
804 ::std::result::Result::Ok(
805 ::aws_smithy_types::endpoint::Endpoint::builder()
806 .url({
807 let mut out = String::new();
808 out.push_str("https://networkmanager.");
809 #[allow(clippy::needless_borrow)]
810 out.push_str(&partition_result.implicit_global_region());
811 out.push_str(".");
812 #[allow(clippy::needless_borrow)]
813 out.push_str(&partition_result.dual_stack_dns_suffix());
814 out
815 })
816 .auth_scheme(
817 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
818 .put("signingRegion", partition_result.implicit_global_region()),
819 )
820 .build(),
821 )
822 }
823 15 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
824 "DualStack is enabled but this partition does not support DualStack".to_string(),
825 )) as ::aws_smithy_runtime_api::box_error::BoxError),
826 16 => {
827 let partition_result = context.partition_result.as_ref().expect("Guaranteed to have a value by earlier checks.");
828 ::std::result::Result::Ok(
829 ::aws_smithy_types::endpoint::Endpoint::builder()
830 .url({
831 let mut out = String::new();
832 out.push_str("https://networkmanager.");
833 #[allow(clippy::needless_borrow)]
834 out.push_str(&partition_result.implicit_global_region());
835 out.push_str(".");
836 #[allow(clippy::needless_borrow)]
837 out.push_str(&partition_result.dns_suffix());
838 out
839 })
840 .auth_scheme(
841 ::aws_smithy_types::endpoint::EndpointAuthScheme::with_capacity("sigv4".to_string(), 1)
842 .put("signingRegion", partition_result.implicit_global_region()),
843 )
844 .build(),
845 )
846 }
847 17 => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
848 "Invalid Configuration: Missing Region".to_string(),
849 )) as ::aws_smithy_runtime_api::box_error::BoxError),
850 _ => ::std::result::Result::Err(Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message(
851 "No endpoint rule matched",
852 )) as ::aws_smithy_runtime_api::box_error::BoxError),
853 };
854 }
855 1 | -1 => {
856 return ::std::result::Result::Err(
857 Box::new(::aws_smithy_http::endpoint::ResolveEndpointError::message("No endpoint rule matched"))
858 as ::aws_smithy_runtime_api::box_error::BoxError,
859 )
860 }
861 ref_val => {
862 let is_complement = ref_val < 0;
863 let node = &NODES[(ref_val.unsigned_abs() as usize) - 1];
864 let condition_result = match node.condition_index {
865 0 => endpoint.is_some(),
866 1 => region.is_some(),
867 2 => (|_diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector| -> bool {
868 let partition_result = &mut context.partition_result;
869 let partition_resolver = &self.partition_resolver;
870 {
871 *partition_result = partition_resolver
872 .resolve_partition(if let Some(param) = region { param } else { return false }, _diagnostic_collector)
873 .map(|inner| inner.into());
874 partition_result.is_some()
875 }
876 })(&mut _diagnostic_collector),
877 3 => (use_fips) == (&true),
878 4 => (|_diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector| -> bool {
879 let partition_result = &context.partition_result;
880 let partition_resolver = &self.partition_resolver;
881 (if let Some(inner) = partition_result {
882 inner.name()
883 } else {
884 return false;
885 }) == ("aws")
886 })(&mut _diagnostic_collector),
887 5 => (use_dual_stack) == (&true),
888 6 => (|_diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector| -> bool {
889 let partition_result = &context.partition_result;
890 let partition_resolver = &self.partition_resolver;
891 (if let Some(inner) = partition_result {
892 inner.name()
893 } else {
894 return false;
895 }) == ("aws-us-gov")
896 })(&mut _diagnostic_collector),
897 7 => (|_diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector| -> bool {
898 let partition_result = &context.partition_result;
899 let partition_resolver = &self.partition_resolver;
900 (if let Some(inner) = partition_result {
901 inner.supports_dual_stack()
902 } else {
903 return false;
904 }) == (true)
905 })(&mut _diagnostic_collector),
906 8 => (|_diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector| -> bool {
907 let partition_result = &context.partition_result;
908 let partition_resolver = &self.partition_resolver;
909 (if let Some(inner) = partition_result {
910 inner.supports_fips()
911 } else {
912 return false;
913 }) == (true)
914 })(&mut _diagnostic_collector),
915 _ => unreachable!("Invalid condition index"),
916 };
917 current_ref = if is_complement ^ condition_result { node.high_ref } else { node.low_ref };
918 }
919 }
920 }
921 }
922}
923
924impl crate::config::endpoint::ResolveEndpoint for DefaultResolver {
925 fn resolve_endpoint<'a>(&'a self, params: &'a crate::config::endpoint::Params) -> ::aws_smithy_runtime_api::client::endpoint::EndpointFuture<'a> {
926 let cached = self.endpoint_cache.load();
928 if let Some((cached_params, cached_endpoint)) = cached.as_ref() {
929 if cached_params == params {
930 return ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(::std::result::Result::Ok(cached_endpoint.clone()));
931 }
932 }
933 drop(cached);
934 let result = self.resolve_endpoint(params);
935 if let ::std::result::Result::Ok(ref endpoint) = result {
936 self.endpoint_cache.store(::std::sync::Arc::new(Some((params.clone(), endpoint.clone()))));
937 }
938 ::aws_smithy_runtime_api::client::endpoint::EndpointFuture::ready(result)
939 }
940}
941const NODES: [crate::endpoint_lib::bdd_interpreter::BddNode; 19] = [
942 crate::endpoint_lib::bdd_interpreter::BddNode {
943 condition_index: -1,
944 high_ref: 1,
945 low_ref: -1,
946 },
947 crate::endpoint_lib::bdd_interpreter::BddNode {
948 condition_index: 0,
949 high_ref: 18,
950 low_ref: 3,
951 },
952 crate::endpoint_lib::bdd_interpreter::BddNode {
953 condition_index: 1,
954 high_ref: 4,
955 low_ref: 100000017,
956 },
957 crate::endpoint_lib::bdd_interpreter::BddNode {
958 condition_index: 2,
959 high_ref: 5,
960 low_ref: 100000017,
961 },
962 crate::endpoint_lib::bdd_interpreter::BddNode {
963 condition_index: 3,
964 high_ref: 10,
965 low_ref: 6,
966 },
967 crate::endpoint_lib::bdd_interpreter::BddNode {
968 condition_index: 4,
969 high_ref: 9,
970 low_ref: 7,
971 },
972 crate::endpoint_lib::bdd_interpreter::BddNode {
973 condition_index: 5,
974 high_ref: 8,
975 low_ref: 100000016,
976 },
977 crate::endpoint_lib::bdd_interpreter::BddNode {
978 condition_index: 7,
979 high_ref: 100000014,
980 low_ref: 100000015,
981 },
982 crate::endpoint_lib::bdd_interpreter::BddNode {
983 condition_index: 5,
984 high_ref: 100000005,
985 low_ref: 100000004,
986 },
987 crate::endpoint_lib::bdd_interpreter::BddNode {
988 condition_index: 4,
989 high_ref: 17,
990 low_ref: 11,
991 },
992 crate::endpoint_lib::bdd_interpreter::BddNode {
993 condition_index: 5,
994 high_ref: 14,
995 low_ref: 12,
996 },
997 crate::endpoint_lib::bdd_interpreter::BddNode {
998 condition_index: 6,
999 high_ref: 100000008,
1000 low_ref: 13,
1001 },
1002 crate::endpoint_lib::bdd_interpreter::BddNode {
1003 condition_index: 8,
1004 high_ref: 100000012,
1005 low_ref: 100000013,
1006 },
1007 crate::endpoint_lib::bdd_interpreter::BddNode {
1008 condition_index: 6,
1009 high_ref: 100000009,
1010 low_ref: 15,
1011 },
1012 crate::endpoint_lib::bdd_interpreter::BddNode {
1013 condition_index: 7,
1014 high_ref: 16,
1015 low_ref: 100000011,
1016 },
1017 crate::endpoint_lib::bdd_interpreter::BddNode {
1018 condition_index: 8,
1019 high_ref: 100000010,
1020 low_ref: 100000011,
1021 },
1022 crate::endpoint_lib::bdd_interpreter::BddNode {
1023 condition_index: 5,
1024 high_ref: 100000007,
1025 low_ref: 100000006,
1026 },
1027 crate::endpoint_lib::bdd_interpreter::BddNode {
1028 condition_index: 3,
1029 high_ref: 100000001,
1030 low_ref: 19,
1031 },
1032 crate::endpoint_lib::bdd_interpreter::BddNode {
1033 condition_index: 5,
1034 high_ref: 100000002,
1035 low_ref: 100000003,
1036 },
1037];
1038#[derive(Default)]
1041#[allow(unused_lifetimes)]
1042pub(crate) struct ConditionContext<'a> {
1043 pub(crate) partition_result: Option<crate::endpoint_lib::partition::Partition<'a>>,
1044 phantom: std::marker::PhantomData<&'a ()>,
1046}
1047
1048#[non_exhaustive]
1049#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
1050pub struct Params {
1052 pub(crate) use_dual_stack: bool,
1054 pub(crate) use_fips: bool,
1056 pub(crate) endpoint: ::std::option::Option<::std::string::String>,
1058 pub(crate) region: ::std::option::Option<::std::string::String>,
1060}
1061impl Params {
1062 pub fn builder() -> crate::config::endpoint::ParamsBuilder {
1064 crate::config::endpoint::ParamsBuilder::default()
1065 }
1066 pub fn use_dual_stack(&self) -> ::std::option::Option<bool> {
1068 Some(self.use_dual_stack)
1069 }
1070 pub fn use_fips(&self) -> ::std::option::Option<bool> {
1072 Some(self.use_fips)
1073 }
1074 pub fn endpoint(&self) -> ::std::option::Option<&str> {
1076 self.endpoint.as_deref()
1077 }
1078 pub fn region(&self) -> ::std::option::Option<&str> {
1080 self.region.as_deref()
1081 }
1082}
1083
1084#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::default::Default, ::std::fmt::Debug)]
1086pub struct ParamsBuilder {
1087 use_dual_stack: ::std::option::Option<bool>,
1088 use_fips: ::std::option::Option<bool>,
1089 endpoint: ::std::option::Option<::std::string::String>,
1090 region: ::std::option::Option<::std::string::String>,
1091}
1092impl ParamsBuilder {
1093 pub fn build(self) -> ::std::result::Result<crate::config::endpoint::Params, crate::config::endpoint::InvalidParams> {
1095 if let Some(region) = &self.region {
1096 if !crate::endpoint_lib::host::is_valid_host_label(
1097 region.as_ref() as &str,
1098 true,
1099 &mut crate::endpoint_lib::diagnostic::DiagnosticCollector::new(),
1100 ) {
1101 return Err(crate::config::endpoint::InvalidParams::invalid_value(
1102 "region",
1103 "must be a valid host label",
1104 ));
1105 }
1106 };
1107 Ok(
1108 #[allow(clippy::unnecessary_lazy_evaluations)]
1109 crate::config::endpoint::Params {
1110 use_dual_stack: self
1111 .use_dual_stack
1112 .or_else(|| Some(false))
1113 .ok_or_else(|| crate::config::endpoint::InvalidParams::missing("use_dual_stack"))?,
1114 use_fips: self
1115 .use_fips
1116 .or_else(|| Some(false))
1117 .ok_or_else(|| crate::config::endpoint::InvalidParams::missing("use_fips"))?,
1118 endpoint: self.endpoint,
1119 region: self.region,
1120 },
1121 )
1122 }
1123 pub fn use_dual_stack(mut self, value: impl Into<bool>) -> Self {
1128 self.use_dual_stack = Some(value.into());
1129 self
1130 }
1131
1132 pub fn set_use_dual_stack(mut self, param: Option<bool>) -> Self {
1137 self.use_dual_stack = param;
1138 self
1139 }
1140 pub fn use_fips(mut self, value: impl Into<bool>) -> Self {
1145 self.use_fips = Some(value.into());
1146 self
1147 }
1148
1149 pub fn set_use_fips(mut self, param: Option<bool>) -> Self {
1154 self.use_fips = param;
1155 self
1156 }
1157 pub fn endpoint(mut self, value: impl Into<::std::string::String>) -> Self {
1161 self.endpoint = Some(value.into());
1162 self
1163 }
1164
1165 pub fn set_endpoint(mut self, param: Option<::std::string::String>) -> Self {
1169 self.endpoint = param;
1170 self
1171 }
1172 pub fn region(mut self, value: impl Into<::std::string::String>) -> Self {
1176 self.region = Some(value.into());
1177 self
1178 }
1179
1180 pub fn set_region(mut self, param: Option<::std::string::String>) -> Self {
1184 self.region = param;
1185 self
1186 }
1187}
1188
1189#[derive(Debug)]
1191pub struct InvalidParams {
1192 field: std::borrow::Cow<'static, str>,
1193 kind: InvalidParamsErrorKind,
1194}
1195
1196#[derive(Debug)]
1198enum InvalidParamsErrorKind {
1199 MissingField,
1200 InvalidValue { message: &'static str },
1201}
1202
1203impl InvalidParams {
1204 #[allow(dead_code)]
1205 fn missing(field: &'static str) -> Self {
1206 Self {
1207 field: field.into(),
1208 kind: InvalidParamsErrorKind::MissingField,
1209 }
1210 }
1211
1212 #[allow(dead_code)]
1213 fn invalid_value(field: &'static str, message: &'static str) -> Self {
1214 Self {
1215 field: field.into(),
1216 kind: InvalidParamsErrorKind::InvalidValue { message },
1217 }
1218 }
1219}
1220
1221impl std::fmt::Display for InvalidParams {
1222 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1223 match self.kind {
1224 InvalidParamsErrorKind::MissingField => write!(f, "a required field was missing: `{}`", self.field),
1225 InvalidParamsErrorKind::InvalidValue { message } => write!(f, "invalid value for field: `{}` - {}", self.field, message),
1226 }
1227 }
1228}
1229
1230impl std::error::Error for InvalidParams {}