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
letcontainerID=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
letcontainerID=ConfigKey<String>("cloudkit.container_id",
envPrefix:"MYAPP",
default:"iCloud.com.example.MyApp")letconfig=ConfigReader(providers:[CommandLineArgumentsProvider(),EnvironmentVariablesProvider(),])extensionConfigReader{func string<Value>(for key:ConfigKey<Value>)->Stringwhere Value ==String{iflet cli = key.key(for:.commandLine),let value =self.string(forKey: cli){return value
}iflet env = key.key(for:.environment),let value =self.string(forKey: env){return value
}return key.defaultValue
}}letresolved= 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.