54 lines
1.7 KiB
Swift
54 lines
1.7 KiB
Swift
//
|
|
// 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<T: Decodable>(_ 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]) ?? [:]
|
|
}
|
|
}
|