SwiftでAT Protocolライブラリを作った
swift-atprotoとは
swift-atprotoには、コード生成をするswift-atprotoコマンドとSwiftAtprotoライブラリの2つから成っています。
nnabeyang/swiftskyのapi/appbskyとapp/comatprotoにあるコードはswift-atprotoから生成したものになります。
生成したコードを呼び出すためには、XRPCClientProtocolに適合するクライアントを実装する必要があります。swiftskyではXRPCBaseClientを継承して、refreshSessionだけ定義しています。
refreshSessionが呼び出しているcomatprototypes.ServerRefreshSessionはlexiconから生成したコードなのでSwiftAtprotoから参照することは出来ません。
また、AT protocolで型がUnknownの場合があります。この場合は$typeフィールドから、どの型にデコードする必要があるのか判断するのですが、$typeの値とSwiftの型を紐付ける必要があります。
swift-atprotoがstatic func registerLexiconTypes()を生成しているので、それを呼び出せば紐付けができます。
XRPCClientにイニシャライザで実行しています。
現状の制限
今の所、BlueSky用のコード生成にしか使えません。lexiconという型定義をもとにコード生成するのですが、lexicon自身に依存関係を解決する仕組みがなく、以下のようにハードコーディングしています。 もちろん、設定ファイルで外から与えることもできるのですが、公式のGo実装のbluesky-social/indigoも同様の状態です。
作った感想
swiftのコード生成に利用しているswift-syntaxのSwiftSyntaxBuilderの使い方を調べるのに苦労しました。いまだに使い方を調べる良い方法がわかっていません。
Discussion