// // DeepLink.swift // // // Created by Juraldinio on 8/9/22. // import Foundation public struct DeepLink { public typealias DataParams = [AnyHashable: Any] public typealias InfoParams = [String: Any] public let action: DeepLinkAction let data: Data? public let info: [String: Any]? public let url: URL? public static func create(params: DataParams?) -> DeepLink? { guard let params = params, let rawAction = params["action"] as? String, let action = DeepLinkAction(rawValue: rawAction), let data = (params["params"] as? String)?.data(using: .utf8) ?? (try? JSONSerialization.data(withJSONObject: params["params"] as? [String: Any], options: [])) else { return nil } return DeepLink(action: action, data: data, info: nil, url: URL(string: params["r"] as? String ?? "")) } public static func create(info: DataParams?) -> DeepLink? { guard let info = info as? [String: Any], let rawAction = info["action"] as? String, let action = DeepLinkAction(rawValue: rawAction) else { return nil } return DeepLink(action: action, data: nil, info: info, url: nil) } public func get(_ model: T.Type) -> T? { guard let data = self.data else { return nil } return try? JSONDecoder().decode(T.self, from: data) } public func dictionary() -> [String: Any] { guard let data = self.data else { return [:] } return (try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]) ?? [:] } }