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