Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

json-schemaからSwiftのAPIクライアントを自動生成するツールを作った

はい、最近なにかと流行っている?json-schema界隈、いかがお過ごしでしょうか。

json-schemaからSwift, Java(未実装)のAPIクライアントを自動生成するツールAriesを作りました。

github.com

機能についてはもう言うこと無いですね。JSONSchemaからSwiftのAPIClientを生成するジェネレータです。Promiseライクに操作したかったので ReactKit/SwiftTask · GitHubを採用。Networking libraryとしてAlamofireを使っています。

なぜ作った

アプリの開発を行うとなったら、今はiOS, Andriodどっちも作るのが当たり前ですよね! どうしたら楽して手っ取り早くクロスフォームでアプリを開発できるのかと、調査を重ねてました。

Xamarin => かなり良さげだけど高い、、お高い+c#知らん。あとロックインコワい。RubyMotion => 好きだったしAndroidも対応きたけど最近下火。 C++でコード共通化 => Dropboxがやってたけど正直かなり鬼門。知識もWebにほとんど落ちてないので1歩歩くごとに地雷を踏みそう。試すしてみたが心折れた。 Rubotoはちょい気になったけどAndroid,Javaの知識薄いので回避。その他大勢のクロスプラットフォームツールたち検討する余地ほぼなし。HTML5も現状検討の余地なし。などなど...クロスプラットフォーム開発についてあとで別記事でまとめておきたい。

頭を悩ませた結果行き着いた先がここでした。

  • iOS,Androidともに知見のおおいネイティブで実装は行う。
  • データベースにRealm, APIクライアントにAriesを使うことでアプリのバックエンド周りの設計と実装をiOS,Androidで共通化させて楽する。アプリのバックエンドの通信周りとデータベース周りを共通化できれば、その分UI層に力を注げるしなかなか良さげ。

なのでどんな感じになるだろうかととりあえず実装してみた。

使い方

コード生成は下記のコマンドにて

$ bin/aries generate json-schema.json --name MyApi \
                                      --url http://api.myapp.com \
                                      --output /path/to/dir

生成されるAPIクライアントはこんな感じ。テンプレートからの生成のためインデントずれてるのはご愛嬌。json-schemaはr7kamura/rack-json_schema · GitHubから拝借しました。

gistb7adef4561ceaaeb9647

これから

まだエクスペリメンタルな実装なのでいろいろと問題を抱えています。

  • 依存関係をうまい具合に解決したい
    • 自動でライブラリとして依存コードもろともプロジェクトまで生成する
    • ミニマルな実装として埋め込む
  • APIクライアントとしての設計
    • iOSクライアントの深淵まで覗いたことがまだ無いため、APIクライアントとしての設計が良いのだろうか。
  • Javaクライアントのジェネレータ

実運用できるまでブラッシュアップさせたい。