import Foundation extension Dictionary where Key == String, Value == Any { func int(_ key: String) -> Int? { return (self[key] as? NSNumber)?.intValue } func double(_ key: String) -> Double? { return (self[key] as? NSNumber)?.doubleValue } func string(_ key: String) -> String? { return self[key] as? String } func bool(_ key: String) -> Bool { return (self[key] as? NSNumber)?.boolValue ?? false } func dict(_ key: String) -> [String: Any]? { return self[key] as? [String: Any] } func ms(_ key: String) throws -> Int? { guard let v = int(key) else { return nil } if v < 0 || v > 600_000 { throw ToolError("\(key) must be between 0 and 600000 ms") } return v } func require(_ key: String, _ get: (String) -> T?) throws -> T { guard let v = get(key) else { throw ToolError("missing or malformed argument: \(key)") } return v } }