carson-katri / swift-request

Declarative HTTP networking, designed for SwiftUI
MIT License
727 stars 41 forks source link

Improve Combine Support #34

Closed carson-katri closed 3 years ago

carson-katri commented 4 years ago

This PR makes Request a Publisher. This allows you to do the following:

let cancellable = Request {
  Url("https://jsonplaceholder.typicode.com/todos")
}
.sink(receiveCompletion: { ... }, receiveValue: { ... })

instead of:

Request {
  Url("https://jsonplaceholder.typicode.com/todos")
}
.onData { ... }
.call()

You can use Combine to apply all sorts of operations to the Request:

let cancellable = Request {
  Url("https://jsonplaceholder.typicode.com/todos")
}
.map(\.data)
.decode([Todo].self, decoder: JSONDecoder())
.sink(receiveCompletion: { ... }, receiveValue: { ... })

Or, even more concisely:

let cancellable = AnyRequest<[Todo]> {
  Url("https://jsonplaceholder.typicode.com/todos")
}
.objectPublisher
.sink(receiveCompletion: { ... }, receiveValue: { ... })

There are also stringPublisher and jsonPublisher, which publisher those respective types.

RequestGroup also conforms to Publisher:

let cancellable = RequestGroup {
  Request {
    Url("https://jsonplaceholder.typicode.com/todos")
  }
  Request {
    Url("https://jsonplaceholder.typicode.com/posts")
  }
  Request {
    Url("https://jsonplaceholder.typicode.com/todos/1")
  }
}
.sink(receiveCompletion: { ... }, receiveValue: { ... })
codecov-commenter commented 4 years ago

Codecov Report

Merging #34 into master will increase coverage by 2.70%. The diff coverage is 92.57%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master      #34      +/-   ##
==========================================
+ Coverage   85.69%   88.39%   +2.70%     
==========================================
  Files          23       25       +2     
  Lines         748      948     +200     
==========================================
+ Hits          641      838     +197     
- Misses        107      110       +3     
Impacted Files Coverage Δ
Sources/Request/Request/Extra/RequestChain.swift 100.00% <ø> (ø)
Sources/Request/Request/Request+Combine.swift 83.33% <83.33%> (ø)
Tests/RequestTests/RequestTests.swift 96.90% <95.69%> (+3.36%) :arrow_up:
...s/Request/Request/Extra/RequestGroup+Combine.swift 100.00% <100.00%> (ø)
Sources/Request/Request/Extra/RequestGroup.swift 100.00% <100.00%> (ø)
Sources/Request/Request/Request.swift 93.10% <100.00%> (+0.05%) :arrow_up:
Sources/Request/Request/RequestParams/Body.swift 100.00% <0.00%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update 703c333...ec1c9c0. Read the comment docs.