RestBird 🦉

Codacy Badge Build Status codecov

Lightweight, stateless REST network manager over the Codable protocol.



  • iOS 9.0+ / macOS 10.11+
  • XCode 10.0+
  • Swift 4.2+


  • [x] Codable support.
  • [x] Built-in Alamofire driver.
  • [x] Built-in URLSession driver.
  • [x] PromiseKit wrapper.
  • [ ] Automatic request parameter serialization (Codable?)

Driver coverage

The following table describes how much the specific drivers cover SessionManager defined in the Core of RestBird.

AlamofireSessionManager 100%
URLSessionManager 70%

Installation Instructions

Swift Package Manager

Add RestBird as a dependency to your project.

.Package(url: "", majorVersion: 0, minorVersion: 4)

You can use RestBird and implement your own session handling or use one of the built-in drivers implemented by RestBird (Alamofire and URLSession).

// Use RestBird without any driver
targets: [
    Target(name: "YourTarget", dependencies: ["RestBird"])

// Use the URLSession Driver
targets: [
    Target(name: "YourTarget", dependencies: [
        .product(name: "RestBird-URLSession", package: "RestBird")

// Use the Alamofire Driver
targets: [
    Target(name: "YourTarget", dependencies: [
        .product(name: "RestBird-Alamofire", package: "RestBird")


# use RestBird without any driver
pod 'RestBird'

# use RestBird with Alamofire driver
pod 'RestBird/Alamofire'

# use RestBird with URLSession driver
pod 'RestBird/URLSession'

You can also try it out by running

pod try RestBird


github "halcyonmobile/RestBird"


Steps for setting up the project for development:

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



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 = ""
    let sessionManager = AlamofireSessionManager()

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 [ email, API.Param.password: password]

Now use your network client to execute requests.

let request = SignIn(email: "", password: "123456")
networkClient.execute(request: request, completion: { result: Result<Authentication> in


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 {

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


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

Check out here.


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