RestBird 🦉

Codacy Badge Build Status codecov

About

Lightweight, stateless REST network manager over the Codable protocol built upon Alamofire.

To learn more aboit this library, check out the documentation.

Requirements

  • iOS 10.0+ / macOS 10.12+
  • XCode 11.4+
  • Swift 5.2+

Features

  • [x] Codable support.
  • [x] PromiseKit wrapper.
  • [x] RxSwift wrapper.
  • [x] Automatic request parameter serialization (Codable?)

Installation Instructions

Swift Package Manager

Add RestBird as a dependency to your project.

.package(url: "https://github.com/Alamofire/Alamofire.git", from: "0.5")

Then, simply integrate RestBird with your target.

targets: [
    Target(name: "YourTarget", dependencies: ["RestBird"])
]

CocoaPods

pod 'RestBird'

You can also try it out by running

pod try RestBird

Carthage

github "halcyonmobile/RestBird"

Setup

Steps for setting up the project for development:

  • Clone the repo
  • Generate Xcode project by executing swift package generate-xcodeproj
  • Open project

Usage

General

First you need to create your NetworkClientConfiguration configuration with your custom or one of the provided session manager drivers. We’re going to use the AlamofireSessionManager.

struct MainAPIConfiguration: NetworkClientConfiguration {
    let baseUrl = "https://api.example.com"
    let sessionManager = AlamofireSessionManager()
    let jsonEncoder = JSONEncoder()
    let jsonDecoder = JSONDecoder()
}

Now we can pass this configuration to the network client.

let networkClient = NetworkClient(configuration: MainAPIConfiguration())

In order to make requests, a DataRequest object should be defined.

struct SignIn: DataRequest {
    typealias ResponseType = Authentication

    let email: String
    let password: String

    let suffix: String? = API.Path.login
    let method: HTTPMethod = .post
    var parameters: [String : Any]? {
        return [API.Param.email: email, API.Param.password: password]
    }
}

Now use your network client to execute requests.

let request = SignIn(email: "john-doe@acme.inc", password: "123456")
networkClient.execute(request: request, completion: { result: Result<Authentication> in
    print(result)
})

Middlewares

Middlewares are a powerful way to intercept network requests or react to the response the endpoint returns.

At the moment, middlewares fall under two categories:

  • Pre Middlewares (evaluated before the request is about to be executed)
  • Post Middlewares (evaluated after the request was executed)
struct LoggerMiddleware: PreMiddleware {
    func willPerform(_ request: URLRequest) throws {
        Logger.log(resquest)
    }
}

struct ErrorMiddleware: PostMiddleware {
    func didPerform(_ request: URLRequest, response: URLResponse, data: Data?) throws {
        if let data = data, let error = ErrorProvider.provide(for: data) {
            throw error
        }
    }
}

// Register middleware
networkClient.register(LoggerMiddleware())
networkClient.register(ErrorMiddleware())

Meta support

To avoid writing boilerplate code for network classes, we wrote a couple of templates to generate code using Sourcery. Head over to the template repository.

Here’s how two requests would look like using the templates:

/// sourcery: Service
protocol PostService {

    /// sourcery: path = /posts/\(id)
    /// sourcery: pathParam = id
    func get(id: String, completion: (result: Result<Post>) -> Void)

    /// sourcery: method = post, path = /posts
    /// sourcery: parameter = post
    /// sourcery: parameter = json
    func save(post: Post, completion: (result: Result<Post>) -> Void)
}

Convenience

You can find convenience wrappers for RestBird which are not distributed through the package. This includes a PromiseKit and an RxSwift wrapper.

Check out here.

License

RestBird is released under the MIT license. See LICENSE for details.

If you use the open-source library in your project, please make sure to credit and backlink to http://halcyonmobile.com