stedi_sdk_config/
endpoint.rs1#![allow(deprecated)]
3
4use aws_smithy_http::endpoint::error::InvalidEndpointError;
5use aws_smithy_http::endpoint::{Endpoint, EndpointPrefix};
6use aws_types::region::{Region, SigningRegion};
7use aws_types::SigningService;
8use std::error::Error;
9use std::fmt::Debug;
10
11#[derive(Clone, Debug)]
18pub struct StediEndpoint {
19 endpoint: Endpoint,
20 credential_scope: CredentialScope,
21}
22
23impl StediEndpoint {
24 pub fn new(endpoint: Endpoint, credential_scope: CredentialScope) -> StediEndpoint {
26 StediEndpoint {
27 endpoint,
28 credential_scope,
29 }
30 }
31
32 pub fn endpoint(&self) -> &Endpoint {
34 &self.endpoint
35 }
36
37 pub fn credential_scope(&self) -> &CredentialScope {
39 &self.credential_scope
40 }
41
42 pub fn set_endpoint(
44 &self,
45 uri: &mut http::Uri,
46 endpoint_prefix: Option<&EndpointPrefix>,
47 ) -> Result<(), InvalidEndpointError> {
48 self.endpoint.set_endpoint(uri, endpoint_prefix)
49 }
50}
51
52pub type BoxError = Box<dyn Error + Send + Sync + 'static>;
54
55pub trait ResolveStediEndpoint: Send + Sync + Debug {
84 fn resolve_endpoint(&self, region: &Region) -> Result<StediEndpoint, BoxError>;
86}
87
88#[derive(Clone, Default, Debug)]
90pub struct CredentialScope {
91 region: Option<SigningRegion>,
92 service: Option<SigningService>,
93}
94
95impl CredentialScope {
96 pub fn builder() -> credential_scope::Builder {
98 credential_scope::Builder::default()
99 }
100}
101
102pub mod credential_scope {
104 use crate::endpoint::CredentialScope;
105 use aws_types::region::SigningRegion;
106 use aws_types::SigningService;
107
108 #[derive(Debug, Default)]
110 pub struct Builder {
111 region: Option<SigningRegion>,
112 service: Option<SigningService>,
113 }
114
115 impl Builder {
116 pub fn region(mut self, region: impl Into<SigningRegion>) -> Self {
118 self.region = Some(region.into());
119 self
120 }
121
122 pub fn service(mut self, service: impl Into<SigningService>) -> Self {
124 self.service = Some(service.into());
125 self
126 }
127
128 pub fn build(self) -> CredentialScope {
130 CredentialScope {
131 region: self.region,
132 service: self.service,
133 }
134 }
135 }
136}
137
138impl CredentialScope {
139 pub fn region(&self) -> Option<&SigningRegion> {
141 self.region.as_ref()
142 }
143
144 pub fn service(&self) -> Option<&SigningService> {
146 self.service.as_ref()
147 }
148
149 pub fn merge(&self, other: &CredentialScope) -> CredentialScope {
152 CredentialScope {
153 region: self.region.clone().or_else(|| other.region.clone()),
154 service: self.service.clone().or_else(|| other.service.clone()),
155 }
156 }
157}
158
159impl ResolveStediEndpoint for Endpoint {
161 fn resolve_endpoint(&self, _region: &Region) -> Result<StediEndpoint, BoxError> {
162 Ok(StediEndpoint {
163 endpoint: self.clone(),
164 credential_scope: Default::default(),
165 })
166 }
167}
168
169#[cfg(test)]
170mod test {
171 use crate::endpoint::CredentialScope;
172 use aws_types::region::SigningRegion;
173 use aws_types::SigningService;
174
175 #[test]
176 fn create_credentials_scope_from_strs() {
177 let scope = CredentialScope::builder()
178 .service("functions")
179 .region("us")
180 .build();
181 assert_eq!(
182 scope.service(),
183 Some(&SigningService::from_static("functions"))
184 );
185 assert_eq!(scope.region(), Some(&SigningRegion::from_static("us")));
186 }
187}