🐤

TwitterAPIKit の RxSwift 対応

2022/07/13に公開

TwitterAPIKit という Swift から Twitter API を叩くためのライブラリを作っています。

https://github.com/mironal/TwitterAPIKit

TwitterAPIKit はレスポンスの受け取り方は callback(closure)形式か Concurrency(async await)形式の両方を提供しています。

    client.v1.tweet.getShowStatus(.init(id: "status id"))
		   .responseDecodable(type: Entity.self) { response in }
    // or
    let response = await client.v1.tweet.getShowStatus(.init(id: "status id"))
				        .responseDecodable(type: Entity.self)

一方で RxSwift を使っているプロジェクトの場合は RxSwift に適した形式(Single<SomeResponse> 的な)でレスポンスを受け取りたいとう要望も多いと思います。

こんなイメージ

client.v1.tweet.rx.getShowStatus(.init(id: "status id"))
                  .subscribe()
		  .disposed(by: disposeBag)

そんな要望に応えるために以下の RxSwift 用の extension を用意しました。

以下の gist にある 1_TwitterAPIKit+RxSwift.generated.swift を自分のプロジェクト内にコピペしてもらうと使用できます。

https://gist.github.com/mironal/eec8eeb1bb256c27e4dccea261d47e7e

以下細かいことを解説したいと思います。

諸注意

  • 全てのメソッドが対応しているわけではありません。 ユーティリティ系メソッドなどはコード生成で書くのが大変だったので非対応です
    • そんなに難しくないと思うので必要な人は自前で書いてみてください(難しかったら書いてあげます)
  • クソでかいのでコピペすると Xcode がしばらくフリーズしますがそのまま待ってください
  • 使い方

なぜコピペして使う形式?

ライブラリ(TwitterAPIKit)本体は他のライブラリへの依存を持たない方針のためです。
必要な人だけが使っていただければと思います。

全部書いたの? 頭おかしいの?

Rx 拡張は 2500行近くありますが手で書いたわけではありません。 Sourcery を使ってコード生成しています。

コード生成に使用した stencil ファイルは同じ gist のページにあります↓。

https://gist.github.com/mironal/eec8eeb1bb256c27e4dccea261d47e7e#file-3_gen-rxswift-extensions-stencil

Any とか Data でレスポンスを受け取りたいんだけど?

コード生成に使用した stencil のテンプレートをいじると変更できると思います。

https://gist.github.com/mironal/eec8eeb1bb256c27e4dccea261d47e7e#file-3_gen-rxswift-extensions-stencil

いろいろ

TwitterAPIKit は各 API の property は protocol で公開していましたが、それだと RxSwift の拡張 (extension Reactive where Base: Hoge 的なやつ) が書けないため全て class に書き直しました。

以下の PR でその修正を行っています。

https://github.com/mironal/TwitterAPIKit/pull/127

Discussion