Skip to content

Commit 5b10c21

Browse files
authored
Merge pull request #4 from ServerDriven/develop
Develop
2 parents c8dc7cc + 2a461d1 commit 5b10c21

File tree

7 files changed

+74
-48
lines changed

7 files changed

+74
-48
lines changed

.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>SchemeUserState</key>
6+
<dict>
7+
<key>ScreenDataNavigation.xcscheme_^#shared#^_</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>0</integer>
11+
</dict>
12+
</dict>
13+
<key>SuppressBuildableAutocreation</key>
14+
<dict>
15+
<key>ScreenDataNavigation</key>
16+
<dict>
17+
<key>primary</key>
18+
<true/>
19+
</dict>
20+
<key>ScreenDataNavigationTests</key>
21+
<dict>
22+
<key>primary</key>
23+
<true/>
24+
</dict>
25+
</dict>
26+
</dict>
27+
</plist>

Package.resolved

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ let package = Package(
1818
dependencies: [
1919
// Dependencies declare other packages that this package depends on.
2020
// .package(url: /* package url */, from: "1.0.0"),
21-
.package(name: "ScreenData", url: "https://github.com/ServerDriven/ScreenData-swift", from: "0.2.1")
21+
.package(name: "ScreenData", url: "https://github.com/ServerDriven/ScreenData-swift", from: "0.3.0")
2222
],
2323
targets: [
2424
// Targets are the basic building blocks of a package. A target can define a module or a test suite.

Sources/ScreenDataNavigation/ScreenDataNavigation.swift

Lines changed: 33 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,31 @@ import Foundation
44

55
// MARK: ScreenProviding
66

7+
@available(iOS 13.0, OSX 10.15, *)
78
public protocol ScreenProviding {
8-
func screen(forID id: String) -> Future<SomeScreen, Error>
9+
func screen(forID id: String) -> AnyPublisher<SomeScreen, Error>
910
}
1011

1112
// MARK: ScreenProviding Basic Implementation
12-
13+
@available(iOS 13.0, OSX 10.15, *)
1314
public struct MockScreenProvider: ScreenProviding {
1415
public var mockScreen: SomeScreen
1516

1617
public init(mockScreen: SomeScreen) {
1718
self.mockScreen = mockScreen
1819
}
1920

20-
public func screen(forID id: String) -> Future<SomeScreen, Error> {
21+
public func screen(forID id: String) -> AnyPublisher<SomeScreen, Error> {
2122
Future { promise in
2223
var screen = mockScreen
2324
screen.id = id
2425
promise(.success(screen))
2526
}
27+
.eraseToAnyPublisher()
2628
}
2729
}
2830

31+
@available(iOS 13.0, OSX 10.15, *)
2932
public struct URLScreenProvider: ScreenProviding {
3033
public enum URLScreenProviderError: Error {
3134
case noResponse
@@ -38,7 +41,7 @@ public struct URLScreenProvider: ScreenProviding {
3841
self.baseURL = baseURL
3942
}
4043

41-
public func screen(forID id: String) -> Future<SomeScreen, Error> {
44+
public func screen(forID id: String) -> AnyPublisher<SomeScreen, Error> {
4245
Future { promise in
4346
URLSession.shared.dataTask(with: baseURL.appendingPathComponent(id)) { (data, response, error) in
4447
if let error = error {
@@ -62,9 +65,11 @@ public struct URLScreenProvider: ScreenProviding {
6265
}
6366
}.resume()
6467
}
68+
.eraseToAnyPublisher()
6569
}
6670
}
6771

72+
@available(iOS 13.0, OSX 10.15, *)
6873
public struct UserDefaultScreenProvider: ScreenProviding {
6974
public enum UserDefaultScreenProviderError: Error {
7075
case noData
@@ -76,7 +81,7 @@ public struct UserDefaultScreenProvider: ScreenProviding {
7681
self.baseKey = baseKey
7782
}
7883

79-
public func screen(forID id: String) -> Future<SomeScreen, Error> {
84+
public func screen(forID id: String) -> AnyPublisher<SomeScreen, Error> {
8085
Future { promise in
8186
guard let data = UserDefaults.standard.data(forKey: baseKey + id) else {
8287
promise(.failure(UserDefaultScreenProviderError.noData))
@@ -89,24 +94,26 @@ public struct UserDefaultScreenProvider: ScreenProviding {
8994
promise(.failure(error))
9095
}
9196
}
97+
.eraseToAnyPublisher()
9298
}
9399
}
94100

95101
// MARK: ScreenStoring
102+
@available(iOS 13.0, OSX 10.15, *)
96103
public protocol ScreenStoring {
97-
func store(screens: [SomeScreen]) -> Future<Void, Error>
104+
func store(screens: [SomeScreen]) -> AnyPublisher<Void, Error>
98105
}
99106

100107
// MARK: ScreenStoring Basic Implementation
101-
108+
@available(iOS 13.0, OSX 10.15, *)
102109
public struct UserDefaultScreenStorer: ScreenStoring {
103110
public var baseKey: String
104111

105112
public init(baseKey: String) {
106113
self.baseKey = baseKey
107114
}
108115

109-
public func store(screens: [SomeScreen]) -> Future<Void, Error> {
116+
public func store(screens: [SomeScreen]) -> AnyPublisher<Void, Error> {
110117
Future { promise in
111118
do {
112119
try screens.forEach { screen in
@@ -120,45 +127,28 @@ public struct UserDefaultScreenStorer: ScreenStoring {
120127
promise(.failure(error))
121128
}
122129
}
130+
.eraseToAnyPublisher()
123131
}
124132
}
125133

126134
// MARK: ScreenLoading
135+
@available(iOS 13.0, OSX 10.15, *)
127136
public protocol ScreenLoading {
128-
func load(withProvider provider: ScreenProviding) -> Future<[SomeScreen], Error>
137+
func load(withProvider provider: ScreenProviding) -> AnyPublisher<[SomeScreen], Error>
129138
}
130139

131-
// MARK: ScreenLoading Basic Implementation [WIP]
132-
//
140+
//// MARK: ScreenLoading Basic Implementation [WIP]
141+
//@available(iOS 13.0, OSX 10.15, *)
133142
//extension SomeScreen: ScreenLoading {
134143
//
135-
// public func load(withProvider provider: ScreenProviding) -> Future<[SomeScreen], Error> {
136-
// Future { promise in
137-
// var bag = [AnyCancellable]()
138-
// var screens = [SomeScreen]()
139-
//
140-
// Publishers.MergeMany(
141-
// destinations
142-
// .filter { $0.type == .screen }
143-
// .map { destination in
144-
// provider.screen(forID: destination.toID)
145-
// }.lazy
146-
// .publisher
147-
// .collect()
148-
// )
149-
// .sink(receiveCompletion: { _ in }) { (result) in
150-
//
151-
//// result.forEach { futureScreen in
152-
//// futureScreen
153-
//// .sink(receiveCompletion: { _ in }) { (screen) in
154-
//// screens.append(screen)
155-
//// }
156-
//// .store(in: &bag)
157-
//// }
158-
// }
159-
// .store(in: &bag)
160-
//
161-
// }
144+
// public func load(withProvider provider: ScreenProviding) -> AnyPublisher<[SomeScreen], Error> {
145+
// Publishers.MergeMany(
146+
// destinations
147+
// .filter { $0.type == .screen }
148+
// .map { destination in
149+
// provider.screen(forID: destination.toID)
150+
// }
151+
// )
162152
// }
163153
//}
164154

@@ -179,9 +169,11 @@ public extension SomeView {
179169
let destinations = [someCustomView.destination,
180170
someCustomView.someImage?.destination]
181171
.compactMap { $0 }
182-
let subViewDestinations = someCustomView.views
183-
.map(\.destinations)
184-
.reduce([], +)
172+
guard let subViewDestinations = someCustomView.views?
173+
.map(\.destinations)
174+
.reduce([], +) else {
175+
return destinations
176+
}
185177

186178
return destinations + subViewDestinations
187179
}

Tests/ScreenDataNavigationTests/ScreenDataNavigationTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ final class ScreenDataNavigationTests: XCTestCase {
1212
let screen = SomeScreen(title: "Title",
1313
subtitle: nil,
1414
backgroundColor: SomeColor(red: 0, green: 0, blue: 0),
15-
headerView: SomeView(type: .container, someContainer: SomeContainerView(axis: .vertical, views: [
16-
SomeView(type: .label, someLabel: SomeLabel(title: "Hello World", subtitle: nil, style: nil, destination: Destination(type: .url, toID: "https://github.com/ServerDriven/ScreenData")))
15+
headerView: SomeView(type: .container, someContainer: SomeContainerView(isScrollable: true, axis: .vertical, views: [
16+
SomeView(type: .label, someLabel: SomeLabel(title: "Hello World", subtitle: nil, font: .largeTitle, style: nil, destination: Destination(type: .url, toID: "https://github.com/ServerDriven/ScreenData")))
1717
], style: nil)),
18-
someView: SomeView(type: .label, someLabel: SomeLabel(title: "Hello World", subtitle: nil, style: nil, destination: Destination(type: .screen, toID: "/some/data/5"))))
18+
someView: SomeView(type: .label, someLabel: SomeLabel(title: "Hello World", subtitle: nil, font: .largeTitle, style: nil, destination: Destination(type: .screen, toID: "/some/data/5"))))
1919

2020
XCTAssertEqual(destinations.map { $0.toID },
2121
screen.destinations.map { $0.toID })

0 commit comments

Comments
 (0)