SwiftでAT Protocolライブラリを作った
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自身に依存関係を解決する仕組みがなく、以下のようにハードコーディングしています。bluesky-social/indigoも同様の状態です。
もちろん、設定ファイルで外から与えることもできるのですが、公式のGo実装の作った感想
swiftのコード生成に利用しているswift-syntaxのSwiftSyntaxBuilder
の使い方を調べるのに苦労しました。いまだに使い方を調べる良い方法がわかっていません。
Discussion