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