Skip to content

Commit 9a99421

Browse files
authored
Added new methods to protocols (#15)
* Reorder methods * Added async methods to return Generic Decodable Types
1 parent a9d0f79 commit 9a99421

File tree

1 file changed

+95
-55
lines changed

1 file changed

+95
-55
lines changed

Sources/Networking/DataTranserService/NetworkDataTransferService.swift

Lines changed: 95 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,17 @@ public protocol NetworkDataTransferService: AnyObject {
3131
@available(iOS 16, *)
3232
func request<T: Decodable, E: RequestableEndpoint>(with endpoint: E) async -> TaskType<T> where E.ResponseType == T
3333

34+
@available(macOS 10.15, *)
35+
@available(iOS 16, *)
36+
func request<T: Decodable, E: RequestableEndpoint>(with endpoint: E) async throws -> T where E.ResponseType == T
37+
3438
@available(iOS 16, *)
3539
@available(macOS 10.15, *)
3640
func request<T: Decodable, E: RequestableEndpoint>(with endpoints: [E]) async -> TaskTypeCollection<T> where E.ResponseType == T
41+
42+
@available(iOS 16, *)
43+
@available(macOS 10.15, *)
44+
func request<T: Decodable, E: RequestableEndpoint>(with endpoints: [E]) async throws -> [T] where E.ResponseType == T
3745
}
3846

3947
// MARK: Concrete Implementation
@@ -68,6 +76,35 @@ public final class DefaultNetworkDataTransferService {
6876
group.leave()
6977
}
7078
}
79+
80+
81+
private func decode<T: Decodable>(data: Data?, decoder: ResponseDecoder) -> Result<T, NetworkDataTransferError> {
82+
do {
83+
guard let data = data else {
84+
return .failure(NetworkDataTransferError.noResponse)
85+
}
86+
87+
let decoded: T = try decoder.decode(data: data)
88+
return .success(decoded)
89+
} catch {
90+
self.logger.log(error: error)
91+
return .failure(NetworkDataTransferError.parsing(error))
92+
}
93+
}
94+
95+
private func decode<T: Decodable>(data: Data?, decoder: ResponseDecoder) throws -> T {
96+
do {
97+
guard let data = data else {
98+
throw NetworkDataTransferError.noResponse
99+
}
100+
101+
let decoded: T = try decoder.decode(data: data)
102+
return decoded
103+
} catch {
104+
self.logger.log(error: error)
105+
throw NetworkDataTransferError.parsing(error)
106+
}
107+
}
71108
}
72109

73110
extension DefaultNetworkDataTransferService: NetworkDataTransferService {
@@ -101,6 +138,36 @@ extension DefaultNetworkDataTransferService: NetworkDataTransferService {
101138
return requestCollection
102139
}
103140

141+
public func request<T: Decodable, E: RequestableEndpoint>(
142+
with endpoint: E,
143+
on queue: (any NetworkDataTransferQueue)? = nil,
144+
completion: @escaping (Result<T, NetworkDataTransferError>) -> Void
145+
) -> (any CancellableHttpRequest)? where E.ResponseType == T {
146+
147+
return networkService.request(endpoint: endpoint) { result in
148+
let completionResult: Result<T, NetworkDataTransferError>
149+
150+
defer {
151+
if let queue = queue {
152+
queue.asyncExecute {
153+
completion(completionResult)
154+
}
155+
}
156+
completion(completionResult)
157+
}
158+
159+
switch result {
160+
case .success(let data):
161+
let result: Result<T, NetworkDataTransferError> = self.decode(data: data, decoder: endpoint.responseDecoder)
162+
completionResult = result
163+
case .failure(let error):
164+
self.logger.log(error: error)
165+
completionResult = .failure(.networkFailure(error))
166+
}
167+
}
168+
169+
}
170+
104171
@available(macOS 10.15, *)
105172
@available(iOS 16, *)
106173
public func request<T: Decodable, E: RequestableEndpoint>(with endpoints: [E]) async -> TaskTypeCollection<T> where T == E.ResponseType {
@@ -130,72 +197,45 @@ extension DefaultNetworkDataTransferService: NetworkDataTransferService {
130197

131198
@available(macOS 10.15, *)
132199
@available(iOS 16, *)
133-
public func request<T:Decodable, E: RequestableEndpoint>(with endpoint: E) async -> TaskType<T> where T == E.ResponseType {
134-
let task = Task {
135-
let responseData = try await networkService.request(endpoint: endpoint).value
136-
let decodedData:T = try self.decode(data: responseData, decoder: endpoint.responseDecoder)
137-
138-
return decodedData
139-
}
140-
141-
return task
142-
}
143-
144-
public func request<T: Decodable, E: RequestableEndpoint>(
145-
with endpoint: E,
146-
on queue: (any NetworkDataTransferQueue)? = nil,
147-
completion: @escaping (Result<T, NetworkDataTransferError>) -> Void
148-
) -> (any CancellableHttpRequest)? where E.ResponseType == T {
149-
150-
return networkService.request(endpoint: endpoint) { result in
151-
let completionResult: Result<T, NetworkDataTransferError>
152-
153-
defer {
154-
if let queue = queue {
155-
queue.asyncExecute {
156-
completion(completionResult)
157-
}
200+
public func request<T: Decodable, E: RequestableEndpoint>(with endpoints: [E]) async throws -> [T] where T == E.ResponseType {
201+
let responseData = try await withThrowingTaskGroup(of: T.self, returning: [T].self) { taskGroup in
202+
for endpoint in endpoints {
203+
taskGroup.addTask {
204+
try await self.request(with: endpoint).value
158205
}
159-
completion(completionResult)
160206
}
161207

162-
switch result {
163-
case .success(let data):
164-
let result: Result<T, NetworkDataTransferError> = self.decode(data: data, decoder: endpoint.responseDecoder)
165-
completionResult = result
166-
case .failure(let error):
167-
self.logger.log(error: error)
168-
completionResult = .failure(.networkFailure(error))
208+
var data: [T] = []
209+
210+
for try await item in taskGroup {
211+
data.append(item)
169212
}
213+
214+
return data
170215
}
171216

217+
return responseData
172218
}
173219

174-
private func decode<T: Decodable>(data: Data?, decoder: ResponseDecoder) -> Result<T, NetworkDataTransferError> {
175-
do {
176-
guard let data = data else {
177-
return .failure(NetworkDataTransferError.noResponse)
178-
}
220+
@available(macOS 10.15, *)
221+
@available(iOS 16, *)
222+
public func request<T:Decodable, E: RequestableEndpoint>(with endpoint: E) async -> TaskType<T> where T == E.ResponseType {
223+
let task = Task {
224+
let responseData = try await networkService.request(endpoint: endpoint).value
225+
let decodedData:T = try self.decode(data: responseData, decoder: endpoint.responseDecoder)
179226

180-
let decoded: T = try decoder.decode(data: data)
181-
return .success(decoded)
182-
} catch {
183-
self.logger.log(error: error)
184-
return .failure(NetworkDataTransferError.parsing(error))
227+
return decodedData
185228
}
229+
230+
return task
186231
}
187232

188-
private func decode<T: Decodable>(data: Data?, decoder: ResponseDecoder) throws -> T {
189-
do {
190-
guard let data = data else {
191-
throw NetworkDataTransferError.noResponse
192-
}
193-
194-
let decoded: T = try decoder.decode(data: data)
195-
return decoded
196-
} catch {
197-
self.logger.log(error: error)
198-
throw NetworkDataTransferError.parsing(error)
199-
}
233+
@available(macOS 10.15, *)
234+
@available(iOS 16, *)
235+
public func request<T:Decodable, E: RequestableEndpoint>(with endpoint: E) async throws -> T where T == E.ResponseType {
236+
let responseData = try await networkService.request(endpoint: endpoint).value
237+
let decodedData:T = try self.decode(data: responseData, decoder: endpoint.responseDecoder)
238+
239+
return decodedData
200240
}
201241
}

0 commit comments

Comments
 (0)