A tiny, dependency-free Swift package for defining configuration keys that resolve consistently across multiple sources (command-line arguments, environment variables, …).
ConfigKeyKit pairs naturally with apple/swift-configuration
but does not depend on it — the package is intentionally Foundation-only
so it can be adopted by any Swift app or library without pulling in a
configuration framework.
A single ConfigKeyKit product bundles:
- Key types —
ConfigKey,OptionalConfigKey,ConfigurationKey,NamingStyle,StandardNamingStyle,ConfigKeySource. - CLI scaffolding —
Command,CommandRegistry,CommandLineParser,ConfigurationParseable. A lightweight command-dispatch pattern you can ignore if you only need keys.
import ConfigKeyKit
let containerID = ConfigKey<String>(
"cloudkit.container_id",
envPrefix: "MYAPP",
default: "iCloud.com.example.MyApp"
)
containerID.key(for: .commandLine) // "cloudkit.container_id"
containerID.key(for: .environment) // "MYAPP_CLOUDKIT_CONTAINER_ID"
containerID.defaultValue // "iCloud.com.example.MyApp"You then feed those resolved key strings into whatever provider stack you prefer (Swift Configuration, environment lookup, manual argument parsing, …).
ConfigKey resolves a single base key into per-source strings, which slots
neatly into swift-configuration's provider stack. Each
provider sees the key name it expects (dot-separated for CLI, screaming snake
case for ENV), while your call site stays declarative:
import Configuration
import ConfigKeyKit
let containerID = ConfigKey<String>(
"cloudkit.container_id",
envPrefix: "MYAPP",
default: "iCloud.com.example.MyApp"
)
let config = ConfigReader(providers: [
CommandLineArgumentsProvider(),
EnvironmentVariablesProvider(),
])
extension ConfigReader {
func string<Value>(for key: ConfigKey<Value>) -> String where Value == String {
if let cli = key.key(for: .commandLine),
let value = self.string(forKey: cli) {
return value
}
if let env = key.key(for: .environment),
let value = self.string(forKey: env) {
return value
}
return key.defaultValue
}
}
let resolved = config.string(for: containerID)
// Looks up "cloudkit.container_id" on the CLI, falls back to
// "MYAPP_CLOUDKIT_CONTAINER_ID" in the environment, then the default.- MistDemo — the demo app inside MistKit.
- BushelCloud.
.package(url: "https://github.com/brightdigit/ConfigKeyKit.git", from: "1.0.0-beta.1"),.target(
name: "MyApp",
dependencies: [
.product(name: "ConfigKeyKit", package: "ConfigKeyKit"),
]
),MIT — see LICENSE.