mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-16 20:40:45 +00:00
89 lines
2.5 KiB
Swift
89 lines
2.5 KiB
Swift
import Foundation
|
|
|
|
public extension AnyCodable {
|
|
var stringValue: String? {
|
|
self.value as? String
|
|
}
|
|
|
|
var boolValue: Bool? {
|
|
if let value = self.value as? Bool {
|
|
return value
|
|
}
|
|
if let number = self.value as? NSNumber, CFGetTypeID(number) == CFBooleanGetTypeID() {
|
|
return number.boolValue
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var intValue: Int? {
|
|
if let value = self.value as? Int {
|
|
return value
|
|
}
|
|
if let number = self.value as? NSNumber, CFGetTypeID(number) != CFBooleanGetTypeID() {
|
|
let value = number.doubleValue
|
|
if value > 0, value.rounded(.towardZero) == value, value <= Double(Int.max) {
|
|
return Int(value)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var doubleValue: Double? {
|
|
if let value = self.value as? Double {
|
|
return value
|
|
}
|
|
if let value = self.value as? Int {
|
|
return Double(value)
|
|
}
|
|
if let number = self.value as? NSNumber, CFGetTypeID(number) != CFBooleanGetTypeID() {
|
|
return number.doubleValue
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var dictionaryValue: [String: AnyCodable]? {
|
|
if let value = self.value as? [String: AnyCodable] {
|
|
return value
|
|
}
|
|
if let value = self.value as? [String: Any] {
|
|
return value.mapValues(AnyCodable.init)
|
|
}
|
|
if let value = self.value as? NSDictionary {
|
|
var converted: [String: AnyCodable] = [:]
|
|
for case let (key as String, raw) in value {
|
|
converted[key] = AnyCodable(raw)
|
|
}
|
|
return converted
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var arrayValue: [AnyCodable]? {
|
|
if let value = self.value as? [AnyCodable] {
|
|
return value
|
|
}
|
|
if let value = self.value as? [Any] {
|
|
return value.map(AnyCodable.init)
|
|
}
|
|
if let value = self.value as? NSArray {
|
|
return value.map(AnyCodable.init)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var foundationValue: Any {
|
|
switch self.value {
|
|
case let dict as [String: AnyCodable]:
|
|
dict.mapValues(\.foundationValue)
|
|
case let array as [AnyCodable]:
|
|
array.map(\.foundationValue)
|
|
case let dict as [String: Any]:
|
|
dict.mapValues { AnyCodable($0).foundationValue }
|
|
case let array as [Any]:
|
|
array.map { AnyCodable($0).foundationValue }
|
|
default:
|
|
self.value
|
|
}
|
|
}
|
|
}
|