Files
2026-07-13 12:22:33 +08:00

108 lines
3.7 KiB
Swift

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 cloudWatchAPIURLKey = "CODEXBAR_BEDROCK_CLOUDWATCH_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
}
}