1234567891011121314151617181920212223242526272829303132333435363738394041 |
- #if os(iOS) || os(tvOS)
- import UIKit
- #if !COCOAPODS
- import URLMatcher
- #endif
- open class Navigator: NavigatorType {
- public let matcher = URLMatcher()
- open weak var delegate: NavigatorDelegate?
- private var viewControllerFactories = [URLPattern: ViewControllerFactory]()
- private var handlerFactories = [URLPattern: URLOpenHandlerFactory]()
- public init() {
- // ⛵ I'm a Navigator!
- }
- open func register(_ pattern: URLPattern, _ factory: @escaping ViewControllerFactory) {
- self.viewControllerFactories[pattern] = factory
- }
- open func handle(_ pattern: URLPattern, _ factory: @escaping URLOpenHandlerFactory) {
- self.handlerFactories[pattern] = factory
- }
- open func viewController(for url: URLConvertible, context: Any? = nil) -> UIViewController? {
- let urlPatterns = Array(self.viewControllerFactories.keys)
- guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }
- guard let factory = self.viewControllerFactories[match.pattern] else { return nil }
- return factory(url, match.values, context)
- }
- open func handler(for url: URLConvertible, context: Any?) -> URLOpenHandler? {
- let urlPatterns = Array(self.handlerFactories.keys)
- guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }
- guard let handler = self.handlerFactories[match.pattern] else { return nil }
- return { handler(url, match.values, context) }
- }
- }
- #endif
|