Swift 环境解码器

利用 Swift 的 Decodable 对环境进行类型安全的访问

CI Codecov branch

license GitHub release

开始使用

Swift Package Manager

.package(url: "https://github.com/SwiftScream/swift-environment-decoder.git", from: "0.4.0") 添加到您的 Package.swift 依赖项中

用法

解码环境

import EnvironmentDecoder

struct MyEnvironmentFeatureFlags: Decodable {
    let enableA: Bool
    let enableB: Bool
}

struct MyEnvironment: Decodable {
    let port: UInt16
    let allowedRegions: [String]
    let featureFlags: MyEnvironmentFeatureFlags
}

let environment = try EnvironmentDecoder().decode(MyEnvironment.self)

print("\(environment.allowedRegions.count) allowed region(s)")
print("listening on port \(environment.port)")
if environment.featureFlags.enableA {
    print("A is enabled")
}
if environment.featureFlags.enableB {
    print("B is enabled")
}

上面的代码期望以下形式的环境

PORT=1234
ALLOWED_REGIONS=regionA,regionB,regionC
FEATURE_FLAGS_ENABLE_A=true
FEATURE_FLAGS_ENABLE_B=false

当出现问题时

如果环境无法解码为指定的类型,将抛出 Swift.DecodingError

这是及早发现环境问题的好方法。 在某些情况下,输出一条消息并终止进程可能是合适的。

以下是一些可能发生这种情况的例子

let environment: MyEnvironment
do {
    environment = try EnvironmentDecoder().decode(MyEnvironment.self)
} catch {
    fatalError(error.localizedDescription)
}

替代环境

默认情况下,EnvironmentDecoder 将解码 ProcessInfo.processInfo.environment。 如果这不是你想要的,你可以传入一个 [String: String] 来代替。

let someEnvDictionary: [String: String] = //...
let environment = try EnvironmentDecoder().decode(MyEnvironment.self, from: someEnvDictionary)