Skip to content

Commit eca1732

Browse files
committed
ObjC: getServiceOrFatal and support in ServiceProviderInject
1 parent 7a91260 commit eca1732

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

ServiceContainerKit/Sources/ServiceProviderObjC.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ public class ServiceProviderObjC: NSObject {
3838
@objc public func getService() -> Any? {
3939
return try? swiftProvider.getServiceBindingObjC(params: Void())
4040
}
41+
42+
/// Get Service if there are no errors or fatal with debug details when failure obtain.
43+
@objc public func getServiceOrFatal() -> Any {
44+
do {
45+
return try swiftProvider.getServiceBindingObjC(params: Void())
46+
} catch let error as ServiceObtainError {
47+
fatalError(error.fatalMessage)
48+
} catch {
49+
fatalError(error.localizedDescription)
50+
}
51+
}
4152
}
4253

4354
/// Wrapper ServiceParamsProvider for use in ObjC code.
@@ -65,6 +76,17 @@ public class ServiceParamsProviderObjC: NSObject {
6576
@objc public func getService(params: Any) -> Any? {
6677
return try? swiftProvider.getServiceBindingObjC(params: params)
6778
}
79+
80+
/// Get Service if there are no errors or fatal with debug details when failure obtain.
81+
@objc public func getServiceOrFatal(params: Any) -> Any {
82+
do {
83+
return try swiftProvider.getServiceBindingObjC(params: params)
84+
} catch let error as ServiceObtainError {
85+
fatalError(error.fatalMessage)
86+
} catch {
87+
fatalError(error.localizedDescription)
88+
}
89+
}
6890
}
6991

7092
// MARK: - Private

ServiceInjects/Sources/EntityInjectResolver.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//
88

99
import Foundation
10-
import ServiceContainerKit
1110

1211
/// Token for register entity
1312
public protocol EntityInjectToken: class { }

ServiceInjects/Sources/InjectsLogger.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import Foundation
1010
import ServiceContainerKit
1111

12+
typealias LogRecorder = ServiceContainerKit.LogRecorder
13+
1214
/// Logger for injects
1315
public protocol ServiceInjectLogger: Logger {
1416
func entityInjectResolverDidAutoRemove(entityType: Any.Type, delay: TimeInterval)

ServiceInjects/Sources/ServiceProviderInject.swift

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,69 @@ public final class ServiceProviderInject<Container, Provider> {
1616
private var lazyInitToken: ServiceInjectReadyToken?
1717
private var state = InjectState<Provider>()
1818

19+
// MARK: Common constructors
20+
1921
/// `keyPath` - key in container with value type `ServiceProvider`.
2022
public convenience init<Service>(_ keyPath: KeyPath<Container, Provider>, file: StaticString = #file, line: UInt = #line)
2123
where Provider == ServiceProvider<Service> {
22-
self.init(baseInitFor: keyPath, file: file, line: line)
24+
self.init(baseInitFor: keyPath, map: { $0 }, file: file, line: line)
2325
}
2426

2527
/// `keyPath` - key in container with optional value type `ServiceProvider?`.
2628
public convenience init<Service>(_ keyPath: KeyPath<Container, Provider>, file: StaticString = #file, line: UInt = #line)
2729
where Provider == ServiceProvider<Service>? {
28-
self.init(baseInitFor: keyPath, file: file, line: line)
30+
self.init(baseInitFor: keyPath, map: { $0 }, file: file, line: line)
2931
}
3032

3133
/// `keyPath` - key in container with value type `ServiceParamsProvider`.
3234
public convenience init<Service, Params>(_ keyPath: KeyPath<Container, Provider>, file: StaticString = #file, line: UInt = #line)
3335
where Provider == ServiceParamsProvider<Service, Params> {
34-
self.init(baseInitFor: keyPath, file: file, line: line)
36+
self.init(baseInitFor: keyPath, map: { $0 }, file: file, line: line)
3537
}
3638

3739
/// `keyPath` - key in container with optional value type `ServiceParamsProvider?`.
3840
public convenience init<Service, Params>(_ keyPath: KeyPath<Container, Provider>, file: StaticString = #file, line: UInt = #line)
3941
where Provider == ServiceParamsProvider<Service, Params>? {
40-
self.init(baseInitFor: keyPath, file: file, line: line)
42+
self.init(baseInitFor: keyPath, map: { $0 }, file: file, line: line)
43+
}
44+
45+
// MARK: ObjC constructors
46+
47+
/// `keyPath` - key in container with value type `ServiceProvider`, injected value type is `ServiceProviderObjC`.
48+
public convenience init<Service>(objc keyPath: KeyPath<Container, ServiceProvider<Service>>, file: StaticString = #file, line: UInt = #line)
49+
where Provider == ServiceProviderObjC {
50+
self.init(baseInitFor: keyPath, map: { ServiceProviderObjC($0) }, file: file, line: line)
51+
}
52+
53+
/// `keyPath` - key in container with optional value type `ServiceProvider?`, injected value type is `ServiceProviderObjC?`.
54+
public convenience init<Service>(objc keyPath: KeyPath<Container, ServiceProvider<Service>?>, file: StaticString = #file, line: UInt = #line)
55+
where Provider == ServiceProviderObjC? {
56+
self.init(baseInitFor: keyPath, map: { $0.map { ServiceProviderObjC($0) } }, file: file, line: line)
4157
}
4258

43-
private init(baseInitFor keyPath: KeyPath<Container, Provider>, file: StaticString, line: UInt) {
59+
/// `keyPath` - key in container with value type `ServiceParamsProvider`, injected value type is `ServiceParamsProviderObjC`.
60+
public convenience init<Service, Params>(objc keyPath: KeyPath<Container, ServiceParamsProvider<Service, Params>>, file: StaticString = #file, line: UInt = #line)
61+
where Provider == ServiceParamsProviderObjC {
62+
self.init(baseInitFor: keyPath, map: { ServiceParamsProviderObjC($0) }, file: file, line: line)
63+
}
64+
65+
/// `keyPath` - key in container with optional value type `ServiceParamsProvider?`, injected value type is `ServiceParamsProviderObjC?`.
66+
public convenience init<Service, Params>(objc keyPath: KeyPath<Container, ServiceParamsProvider<Service, Params>?>, file: StaticString = #file, line: UInt = #line)
67+
where Provider == ServiceParamsProviderObjC? {
68+
self.init(baseInitFor: keyPath, map: { $0.map { ServiceParamsProviderObjC($0) } }, file: file, line: line)
69+
}
70+
71+
72+
// MARK: General
73+
74+
private init<SrcProvider>(baseInitFor keyPath: KeyPath<Container, SrcProvider>, map: @escaping (SrcProvider) -> Provider, file: StaticString, line: UInt) {
4475
setup { [unowned self] container in
4576
guard let container = container else {
4677
fatalError("Not found Container for Inject", file: file, line: line)
4778
}
4879

4980
let provider = container[keyPath: keyPath]
50-
self.state.storage.setEntity(provider)
81+
self.state.storage.setEntity(map(provider))
5182
}
5283
}
5384

Tester/ServiceContainers/ServiceContainer.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import Foundation
1010
import ServiceContainerKit
11+
import ServiceInjects
1112

1213
/// DI Continer for swift
1314
struct ServiceContainer {
@@ -40,13 +41,15 @@ struct ServiceContainer {
4041
@objc(ServiceContainer)
4142
class ServiceContainerObjC: NSObject {
4243
init(container: ServiceContainer) {
43-
firstServiceProvider = ServiceProviderObjC(container.firstServiceProvider)
44+
// Not supported for Injects
4445
sharedFirstService = container.sharedFirstService
4546

4647
super.init()
4748
}
4849

49-
@objc let firstServiceProvider: ServiceProviderObjC
50+
@ServiceProviderInject(objc: \ServiceContainer.firstServiceProvider)
51+
@objc var firstServiceProvider
52+
5053
@objc let sharedFirstService: FirstService
5154
}
5255

0 commit comments

Comments
 (0)