import Foundation public enum BedrockAuthMode: String, Codable, Sendable, CaseIterable { case keys case profile} public enum BedrockSettingsReader { public static let accessKeyIDKey = "AWS_ACCESS_KEY_ID" public static let secretAccessKeyKey = "AWS_SECRET_ACCESS_KEY" public static let sessionTokenKey = "AWS_SESSION_TOKEN" public static let regionKeys = ["AWS_REGION", "AWS_DEFAULT_REGION"] public static let budgetKey = "CODEXBAR_BEDROCK_BUDGET" public static let apiURLKey = "CODEXBAR_BEDROCK_API_URL" public static let profileKey = "AWS_PROFILE" public static let authModeKey = "CODEXBAR_BEDROCK_AUTH_MODE" public static let defaultRegion = "us-east-1" public static func accessKeyID(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.cleaned(environment[self.accessKeyIDKey]) } public static func secretAccessKey( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.cleaned(environment[self.secretAccessKeyKey]) } public static func sessionToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.cleaned(environment[self.sessionTokenKey]) } public static func region(environment: [String: String] = ProcessInfo.processInfo.environment) -> String { for key in self.regionKeys { if let value = self.cleaned(environment[key]) { return value } } return self.defaultRegion } public static func budget(environment: [String: String] = ProcessInfo.processInfo.environment) -> Double? { guard let raw = self.cleaned(environment[self.budgetKey]), let value = Double(raw), value > 0 else { return nil } return value } public static func profile( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.cleaned(environment[self.profileKey]) } public static func authMode( environment: [String: String] = ProcessInfo.processInfo.environment) -> BedrockAuthMode { if let raw = self.cleaned(environment[self.authModeKey])?.lowercased(), let mode = BedrockAuthMode(rawValue: raw) { return mode } if self.profile(environment: environment) != nil, !self.hasStaticKeys(environment: environment) { return .profile } return .keys } static func hasStaticKeys(environment: [String: String]) -> Bool { self.accessKeyID(environment: environment) != nil && self.secretAccessKey(environment: environment) != nil } public static func hasCredentials( environment: [String: String] = ProcessInfo.processInfo.environment) -> Bool { switch self.authMode(environment: environment) { case .keys: self.hasStaticKeys(environment: environment) case .profile: self.profile(environment: environment) != nil } } static func cleaned(_ raw: String?) -> String? { guard var value = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else { return nil } if (value.hasPrefix("\"") && value.hasSuffix("\"")) || (value.hasPrefix("'") && value.hasSuffix("'")) { value = String(value.dropFirst().dropLast()) } value = value.trimmingCharacters(in: .whitespacesAndNewlines) return value.isEmpty ? nil : value }}
import Foundation
public enum BedrockAuthMode: String, Codable, Sendable, CaseIterable {
case keys
case profile
}
public enum BedrockSettingsReader {
public static let accessKeyIDKey = "AWS_ACCESS_KEY_ID"
public static let secretAccessKeyKey = "AWS_SECRET_ACCESS_KEY"
public static let sessionTokenKey = "AWS_SESSION_TOKEN"
public static let regionKeys = ["AWS_REGION", "AWS_DEFAULT_REGION"]
public static let budgetKey = "CODEXBAR_BEDROCK_BUDGET"
public static let apiURLKey = "CODEXBAR_BEDROCK_API_URL"
public static let profileKey = "AWS_PROFILE"
public static let authModeKey = "CODEXBAR_BEDROCK_AUTH_MODE"
public static let defaultRegion = "us-east-1"
public static func accessKeyID(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? {
self.cleaned(environment[self.accessKeyIDKey])
}
public static func secretAccessKey(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.cleaned(environment[self.secretAccessKeyKey])
}
public static func sessionToken(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.cleaned(environment[self.sessionTokenKey])
}
public static func region(environment: [String: String] = ProcessInfo.processInfo.environment) -> String {
for key in self.regionKeys {
if let value = self.cleaned(environment[key]) {
return value
}
}
return self.defaultRegion
}
public static func budget(environment: [String: String] = ProcessInfo.processInfo.environment) -> Double? {
guard let raw = self.cleaned(environment[self.budgetKey]),
let value = Double(raw),
value > 0
else {
return nil
}
return value
}
public static func profile(
environment: [String: String] = ProcessInfo.processInfo.environment) -> String?
{
self.cleaned(environment[self.profileKey])
}
public static func authMode(
environment: [String: String] = ProcessInfo.processInfo.environment) -> BedrockAuthMode
{
if let raw = self.cleaned(environment[self.authModeKey])?.lowercased(),
let mode = BedrockAuthMode(rawValue: raw)
{
return mode
}
if self.profile(environment: environment) != nil,
!self.hasStaticKeys(environment: environment)
{
return .profile
}
return .keys
}
static func hasStaticKeys(environment: [String: String]) -> Bool {
self.accessKeyID(environment: environment) != nil &&
self.secretAccessKey(environment: environment) != nil
}
public static func hasCredentials(
environment: [String: String] = ProcessInfo.processInfo.environment) -> Bool
{
switch self.authMode(environment: environment) {
case .keys:
self.hasStaticKeys(environment: environment)
case .profile:
self.profile(environment: environment) != nil
}
}
static func cleaned(_ raw: String?) -> String? {
guard var value = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else {
return nil
}
if (value.hasPrefix("\"") && value.hasSuffix("\"")) ||
(value.hasPrefix("'") && value.hasSuffix("'"))
{
value = String(value.dropFirst().dropLast())
}
value = value.trimmingCharacters(in: .whitespacesAndNewlines)
return value.isEmpty ? nil : value
}
}