Skip to content

Commit bf6da0e

Browse files
committed
Update error handler in Builder
1 parent a0a55c9 commit bf6da0e

File tree

9 files changed

+223
-92
lines changed

9 files changed

+223
-92
lines changed

DependencyRouter.podspec

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Pod::Spec.new do |s|
44
s.summary = "Router with dependency services and parameters"
55
s.description = <<-DESC
66
Written in Swift.
7-
Router with dependency services and parameters
7+
Router with dependency services and parameters
88
DESC
99

1010
s.homepage = "https://github.com/ProVir/DependencyRouter"
@@ -13,10 +13,8 @@ Pod::Spec.new do |s|
1313
s.source = { :git => "https://github.com/ProVir/DependencyRouter.git", :tag => "#{s.version}" }
1414

1515
s.swift_version = '4.2'
16-
1716
s.ios.deployment_target = '8.0'
1817

19-
2018
s.subspec 'Core' do |ss|
2119
ss.source_files = 'Source/*.{h,swift}'
2220
ss.public_header_files = 'Source/*.h'

DependencyRouter.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
50084EFF215288E000910769 /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = "<group>"; };
5656
50084F032152999D00910769 /* NavigationRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRouter.swift; sourceTree = "<group>"; };
5757
50084F052153447E00910769 /* SegueRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegueRouter.swift; sourceTree = "<group>"; };
58+
5014A9202157DF5400D07293 /* DependencyRouter.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = DependencyRouter.podspec; sourceTree = "<group>"; };
59+
5014A9212157DF6500D07293 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
5860
5040F36A214E284B00A23F08 /* AutoRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoRouter.swift; sourceTree = "<group>"; };
5961
5040F36D214FE74800A23F08 /* InputSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputSource.swift; sourceTree = "<group>"; };
6062
5040F3702150C6E000A23F08 /* UnwindRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnwindRouter.swift; sourceTree = "<group>"; };
@@ -113,6 +115,8 @@
113115
507C9D69214382DB00996677 = {
114116
isa = PBXGroup;
115117
children = (
118+
5014A9202157DF5400D07293 /* DependencyRouter.podspec */,
119+
5014A9212157DF6500D07293 /* README.md */,
116120
507C9D922143833E00996677 /* Example */,
117121
507C9D75214382DB00996677 /* Source */,
118122
507C9D80214382DB00996677 /* DependencyRouterTests */,

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
# DependencyRouter
1+
# DependencyRouter
2+
3+
Alpha version 0.1 without docs and example.

Source/BlankFactory.swift

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,15 @@ extension BuilderRouterReadyCreate where FR: CreatorFactoryRouter {
4343

4444
extension BuilderRouterReadySetup where FR: BlankFactoryRouter {
4545
public func setup() -> BuilderRouterReadyPresent<VC> {
46-
let factory = self.factory
47-
let findedViewController: FR.VCType = dependencyRouterFindViewControllerOrFatalError(viewController)
48-
49-
factory.setupViewController(findedViewController)
50-
return .init(viewController: viewController, default: factory.presentation())
46+
do {
47+
let factory = self.factory
48+
let findedViewController: FR.VCType = try dependencyRouterFindViewController(viewController)
49+
50+
factory.setupViewController(findedViewController)
51+
return .init(viewController: viewController, default: factory.presentation())
52+
} catch {
53+
return .init(error: error)
54+
}
5155
}
5256
}
5357

@@ -61,12 +65,16 @@ extension BuilderRouterReadyCreate where FR: BlankCreatorFactoryRouter {
6165

6266
extension BuilderRouterReadyCreate where FR: CreatorFactoryRouter, FR: BlankFactoryRouter {
6367
public func createAndSetup() -> BuilderRouterReadyPresent<FR.VCCreateType>{
64-
let factory = self.factory()
65-
let viewController = factory.createViewController()
66-
let findedViewController: FR.VCType = dependencyRouterFindViewControllerOrFatalError(viewController)
67-
68-
factory.setupViewController(findedViewController)
69-
return .init(viewController: viewController, default: factory.presentation())
68+
do {
69+
let factory = self.factory()
70+
let viewController = factory.createViewController()
71+
let findedViewController: FR.VCType = try dependencyRouterFindViewController(viewController)
72+
73+
factory.setupViewController(findedViewController)
74+
return .init(viewController: viewController, default: factory.presentation())
75+
} catch {
76+
return .init(error: error)
77+
}
7078
}
7179
}
7280

Source/Builder.swift

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,34 @@ public struct BuilderRouter<FR: FactoryRouter> {
2929
}
3030

3131
public class BuilderRouterReadyPresent<VC: UIViewController> {
32-
public let viewController: VC
33-
public let defaultPresentationSource: ()->PresentationRouter
32+
private enum Store {
33+
case viewController(VC)
34+
case error(Error)
35+
}
3436

37+
private let store: Store
3538
private var prepareHandlers: [()->Void] = []
3639
private var postHandlers: [()->Void] = []
3740

41+
public let defaultPresentationSource: ()->PresentationRouter
42+
43+
public func viewController() throws -> VC {
44+
switch store {
45+
case .viewController(let vc): return vc
46+
case .error(let error): throw error
47+
}
48+
}
49+
3850
public init(viewController: VC, default presentationSource: @autoclosure @escaping ()->PresentationRouter) {
39-
self.viewController = viewController
51+
self.store = .viewController(viewController)
4052
self.defaultPresentationSource = presentationSource
4153
}
4254

55+
public init(error: Error) {
56+
self.store = .error(error)
57+
self.defaultPresentationSource = { NotPresentationRouter() }
58+
}
59+
4360
@discardableResult
4461
public func prepareHandler(_ handler: @escaping ()->Void) -> BuilderRouterReadyPresent<VC> {
4562
prepareHandlers.append(handler)
@@ -52,20 +69,71 @@ public class BuilderRouterReadyPresent<VC: UIViewController> {
5269
return self
5370
}
5471

55-
public func present(on existingController: UIViewController, animated: Bool = true) {
56-
present(on: existingController, presentation: nil, animated: animated)
72+
public func present(on existingController: UIViewController, animated: Bool = true, assertWhenFailure: Bool = true, completionHandler: ((PresentationRouterResult)->Void)? = nil) {
73+
present(on: existingController, presentation: nil, animated: animated, assertWhenFailure: assertWhenFailure, completionHandler: completionHandler)
5774
}
5875

59-
public func present(on existingController: UIViewController, presentation: PresentationRouter?, animated: Bool = true, completionHandler: ((PresentationRouterResult)->Void)? = nil) {
76+
public func present(on existingController: UIViewController, presentation: PresentationRouter?, animated: Bool = true, assertWhenFailure: Bool = true, completionHandler: ((PresentationRouterResult)->Void)? = nil) {
77+
//1. Unwrap VC
78+
let viewController: VC
79+
switch self.store {
80+
case .viewController(let vc):
81+
viewController = vc
82+
83+
case .error(let error):
84+
completionHandler?(.failure(error))
85+
if assertWhenFailure {
86+
try? DependencyRouterError.tryAsAssert { throw error }
87+
}
88+
return
89+
}
90+
91+
//2. Present VC
6092
let handler = PresentationRouterHandler(presentation: presentation ?? defaultPresentationSource(),
6193
viewController: viewController,
6294
prepareHandlers: prepareHandlers,
6395
postHandlers: postHandlers)
64-
handler.present(on: existingController, animated: animated, assertWhenFailure: false, completionHandler: completionHandler)
96+
handler.present(on: existingController, animated: animated, assertWhenFailure: assertWhenFailure, completionHandler: completionHandler)
97+
}
98+
99+
100+
/// Empty stub when used segue or need only setup existing viewController.
101+
@discardableResult
102+
public func isSuccess() -> Bool {
103+
if case .viewController = self.store {
104+
return true
105+
} else {
106+
return false
107+
}
108+
}
109+
110+
/// Empty stub when used segue or need only setup existing viewController.
111+
public func completed() throws {
112+
if case let .error(error) = self.store {
113+
throw error
114+
}
115+
}
116+
117+
/// Empty stub when used segue or need only setup existing viewController.
118+
public func completedOrFatalError() {
119+
DependencyRouterError.tryAsFatalError {
120+
if case let .error(error) = self.store {
121+
throw error
122+
}
123+
}
124+
}
125+
126+
/// Empty stub when used segue or need only setup existing viewController.
127+
public func completedOrAssert() {
128+
try? DependencyRouterError.tryAsAssert {
129+
if case let .error(error) = self.store {
130+
throw error
131+
}
132+
}
65133
}
66134

67135
/// Empty stub when used segue or need only setup existing viewController.
68-
public func completed() { }
136+
public func ignoreResult() { }
69137
}
70138

71139

Source/Core.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,6 @@ public func dependencyRouterFindViewController<VCType: UIViewController>(_ viewC
138138
}
139139
}
140140

141-
public func dependencyRouterFindViewControllerOrFatalError<VCType: UIViewController>(_ viewController: UIViewController, file: StaticString = #file, line: UInt = #line) -> VCType {
142-
return DependencyRouterError.tryAsFatalError(file: file, line: line) {
143-
try dependencyRouterFindViewController(viewController)
144-
}
145-
}
146-
147141

148142
//MARK: Presentation
149143
public struct PresentationRouterHandler {

Source/InputSource.swift

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ extension Router {
6060
return true
6161
}
6262

63+
@discardableResult
64+
public static func tryPrepare(for segue: UIStoryboardSegue, sender: Any?, sourceList: [BaseFactoryInputSource]) throws -> Bool {
65+
guard let (viewController, factory) = dependencyRouterFindSourceRouterViewController(segue.destination) else {
66+
return false
67+
}
68+
69+
try factory.findAndSetup(viewController, sourceList: sourceList, identifier: segue.identifier, sender: sender)
70+
return true
71+
}
72+
6373
@discardableResult
6474
public static func setupIfSupport(viewController: UIViewController, sourceList: [BaseFactoryInputSource], identifier: String?, sender: Any?, fatalErrorWhenFailure: Bool) -> Bool {
6575
guard let (viewController, factory) = dependencyRouterFindSourceRouterViewController(viewController) else {
@@ -80,6 +90,16 @@ extension Router {
8090

8191
return true
8292
}
93+
94+
@discardableResult
95+
public static func trySetupIfSupport(viewController: UIViewController, sourceList: [BaseFactoryInputSource], identifier: String?, sender: Any?) throws -> Bool {
96+
guard let (viewController, factory) = dependencyRouterFindSourceRouterViewController(viewController) else {
97+
return false
98+
}
99+
100+
try factory.findAndSetup(viewController, sourceList: sourceList, identifier: identifier, sender: sender)
101+
return true
102+
}
83103
}
84104

85105

@@ -91,12 +111,13 @@ extension BuilderRouterReadySetup where FR: FactoryRouter, FR: FactorySupportInp
91111

92112
public func setup(sourceList: [BaseFactoryInputSource], identifier: String? = nil, sender: Any? = nil) -> BuilderRouterReadyPresent<VC> {
93113

94-
let factory = self.factory
95-
DependencyRouterError.tryAsFatalError {
114+
do {
115+
let factory = self.factory
96116
try factory.findAndSetup(viewController, sourceList: sourceList, identifier: identifier, sender: sender)
117+
return .init(viewController: viewController, default: factory.presentation())
118+
} catch {
119+
return .init(error: error)
97120
}
98-
99-
return .init(viewController: viewController, default: factory.presentation())
100121
}
101122
}
102123

@@ -106,14 +127,14 @@ extension BuilderRouterReadyCreate where FR: CreatorFactoryRouter, FR: FactorySu
106127
}
107128

108129
public func createAndSetup(sourceList: [BaseFactoryInputSource], identifier: String? = nil, sender: Any? = nil) -> BuilderRouterReadyPresent<FR.VCCreateType> {
109-
let factory = self.factory()
110-
let viewController = factory.createViewController()
111-
112-
DependencyRouterError.tryAsFatalError {
130+
do {
131+
let factory = self.factory()
132+
let viewController = factory.createViewController()
113133
try factory.findAndSetup(viewController, sourceList: sourceList, identifier: identifier, sender: sender)
134+
return .init(viewController: viewController, default: factory.presentation())
135+
} catch {
136+
return .init(error: error)
114137
}
115-
116-
return .init(viewController: viewController, default: factory.presentation())
117138
}
118139
}
119140

0 commit comments

Comments
 (0)