Skip to content

Commit 4649f0c

Browse files
authored
feat: region resolver via bundle (#479)
1 parent 665f1c9 commit 4649f0c

File tree

4 files changed

+92
-2
lines changed

4 files changed

+92
-2
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
#if os(iOS) || os(watchOS) || os(tvOS)
9+
import Foundation.NSBundle
10+
public typealias Bundle = Foundation.Bundle
11+
#else
12+
public struct Bundle {
13+
func object(forInfoDictionaryKey key: String) -> Any? {
14+
return nil
15+
}
16+
public static var main: Bundle = Bundle()
17+
}
18+
#endif
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
// Adapted from: https://nshipster.com/xcconfig/
9+
struct BundleConfiguration {
10+
enum Error: Swift.Error {
11+
case missingKey, invalidValue
12+
}
13+
14+
static func value<T>(bundle: Bundle, for key: String) throws -> T where T: LosslessStringConvertible {
15+
guard let object = bundle.object(forInfoDictionaryKey: key) else {
16+
throw Error.missingKey
17+
}
18+
switch object {
19+
case let value as T:
20+
return value
21+
case let string as String:
22+
guard let value = T(string) else { fallthrough }
23+
return value
24+
default:
25+
throw Error.invalidValue
26+
}
27+
}
28+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
import AwsCommonRuntimeKit
8+
import ClientRuntime
9+
10+
public struct BundleRegionProvider: RegionProvider {
11+
private let logger: SwiftLogger
12+
private let bundle: Bundle
13+
private let regionKey: String
14+
private let maxSizeRegion = 20
15+
16+
public init(bundle: Bundle = Bundle.main, regionKey: String = "AWS_REGION") {
17+
self.logger = SwiftLogger(label: "BundleRegionProvider")
18+
self.bundle = bundle
19+
self.regionKey = regionKey
20+
}
21+
22+
public func resolveRegion() -> Future<String?> {
23+
let future = Future<String?>()
24+
#if os(iOS) || os(watchOS) || os(tvOS)
25+
guard let region = region() else {
26+
future.fulfill(nil)
27+
}
28+
return region.count > maxSizeRegion
29+
? future.fulfill(region.prefix(maxSizeRegion))
30+
: future.fulfill(region)
31+
#else
32+
future.fulfill(nil)
33+
#endif
34+
return future
35+
}
36+
37+
func region() -> String? {
38+
do {
39+
return try BundleConfiguration.value(bundle: self.bundle, for: regionKey)
40+
} catch {
41+
logger.debug("\(error)")
42+
}
43+
return nil
44+
}
45+
}

AWSClientRuntime/Sources/Regions/DefaultRegionResolver.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ public struct DefaultRegionResolver: RegionResolver {
1111
public let providers: [RegionProvider]
1212
let logger: SwiftLogger
1313

14-
public init(providers: [RegionProvider] = [EnvironmentRegionProvider(), ProfileRegionProvider(), IMDSRegionProvider()]) {
15-
// TODO: add more region resolvers i.e. System Properties, etc
14+
public init(providers: [RegionProvider] = [BundleRegionProvider(), EnvironmentRegionProvider(), ProfileRegionProvider(), IMDSRegionProvider()]) {
1615
self.providers = providers
1716
self.logger = SwiftLogger(label: "DefaultRegionProvider")
1817
}

0 commit comments

Comments
 (0)