Navigator.swift 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #if os(iOS) || os(tvOS)
  2. import UIKit
  3. #if !COCOAPODS
  4. import URLMatcher
  5. #endif
  6. open class Navigator: NavigatorType {
  7. public let matcher = URLMatcher()
  8. open weak var delegate: NavigatorDelegate?
  9. private var viewControllerFactories = [URLPattern: ViewControllerFactory]()
  10. private var handlerFactories = [URLPattern: URLOpenHandlerFactory]()
  11. public init() {
  12. // ⛵ I'm a Navigator!
  13. }
  14. open func register(_ pattern: URLPattern, _ factory: @escaping ViewControllerFactory) {
  15. self.viewControllerFactories[pattern] = factory
  16. }
  17. open func handle(_ pattern: URLPattern, _ factory: @escaping URLOpenHandlerFactory) {
  18. self.handlerFactories[pattern] = factory
  19. }
  20. open func viewController(for url: URLConvertible, context: Any? = nil) -> UIViewController? {
  21. let urlPatterns = Array(self.viewControllerFactories.keys)
  22. guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }
  23. guard let factory = self.viewControllerFactories[match.pattern] else { return nil }
  24. return factory(url, match.values, context)
  25. }
  26. open func handler(for url: URLConvertible, context: Any?) -> URLOpenHandler? {
  27. let urlPatterns = Array(self.handlerFactories.keys)
  28. guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }
  29. guard let handler = self.handlerFactories[match.pattern] else { return nil }
  30. return { handler(url, match.values, context) }
  31. }
  32. }
  33. #endif