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