Contents

darrarski/SwiftEndpoint

Lightweight library providing higher level of abstraction for implementing networking in iOS and macOS applications

πŸ›  Tech stack

πŸ“ Description

Endpoint is a generic function that transforms some Request into some Response publisher:

typealias Endpoint<Request, Response> = (Request) -> AnyPublisher<Response, Error>

🧩 Foundation URL networking

Set of helpers for building API clients based on the native Foundation's networking.

urlEndpoint function creates an Endpoint that uses Foundation's networking:

func urlEndpoint<Request, Response>(
  requestFactory: @escaping URLRequestFactory<Request>,
  publisherFactory: @escaping URLResponsePublisherFactory,
  responseValidator: @escaping URLResponseValidator,
  responseDecoder: @escaping URLResponseDecoder<Response>
) -> Endpoint<Request, Response>

URLRequestFactory<Request> is a generic function that transforms some Request into URLRequest, optionally throwing an error:

typealias URLRequestFactory<Request> = (Request) throws -> URLRequest

URLResponsePublisherFactory is a function that transforms URLRequest into URLResponsePublisher:

typealias URLResponsePublisherFactory = (URLRequest) -> URLResponsePublisher

Convenience extension allows to use URLSession as a URLResponsePublisherFactory:

extension URLSession {
  var urlResponsePublisherFactory: URLResponsePublisherFactory { get }
}

URLResponsePublisher is a combine publisher emitting network responses or failing with networking error:

typealias URLResponsePublisher = AnyPublisher<(data: Data, response: URLResponse), Error>

URLResponseValidator is a function that validates response Data and URLResponse, optionally throwing validation error:

typealias URLResponseValidator = (Data, URLResponse) throws -> Void

URLResponseDecoder<Response> is a generic function that transforms response Data and URLResponse into some Response, optionally throwing decoding error:

typealias URLResponseDecoder<Response> = (Data, URLResponse) throws -> Response

🧰 Installation

SwiftEndpoint is compatible with Swift Package Manager. You can add it as a dependency to your Xcode project or swift package.

πŸ›  Development

Running tests:

swift test

Developing in Xcode:

swift package generate-xcodeproj
open -a SwiftEndpoint.xcodeproj

β˜•οΈ Do you like the project?

<a href="https://www.buymeacoffee.com/darrarski" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="60" width="217" style="height: 60px !important;width: 217px !important;" ></a>

πŸ“„ License

Copyright Β© 2020 Dariusz Rybicki Darrarski

License: GNU GPLv3

Package Metadata

Repository: darrarski/SwiftEndpoint

Stars: 5

Forks: 1

Open issues: 0

Default branch: master

Primary language: swift

License: GPL-3.0

Topics: combine-framework, endpoint, networking, swift, swift-package

README: README.md