APIを手軽に使うことができますが、wasm-bindgenにまだ取り込まれていない新しいAPIを使うのはやや面倒です。本稿ではwasm-bindgenがサポートしていないAPIをwasm-bindgenっぽく使う方法を紹介したいと思います。wasm-bindgenがどうやってAPIバインディングを生成しているのかを見るところから始めます。APIはどのブラウザでも同じインタフェースで使えることが期待されています。IDLという特定の実装に依存しない言語で定義されます。ブラウザをつなぐバインディングを生成します。IDLで以下のように定義されています。child);};wasm-bindgenはこの定義を元に以下のようなバインディングを生成します。}}ではこの生成は誰がやっているのでしょうか。答えはweb-sysクレートのビルドスクリプトです。APIを使うときはweb-sysのfeaturesに必要なインターフェースを記述すると思います。web-sysのビルドスクリプトはその情報を使って必要最低限のバインディングを生成します。IDLの定義と取得したインタフェースのリストをwasm_bindgen_webidl::compile()に渡してバインディングを生成するという流れになります。このステップが含意するのは、web-sysのwebidlsに定義のないAPIは使えない、ということです。新しかったりブラウザ間での合意がとれていなかったりするAPIはweb-sysには含まれていないことがあります。この状況をworkaroundしたい、というのが本稿の趣旨です。ここで説明する手段は一時的な対処です。APIの仕様がある程度固まって各ブラウザの実装がそろってきたらwasm-bindgen本体に取り込まれるよう働きかけるのが良いと思います。公式ドキュメントに手順が詳しく書いてありますので参考にしてみてください。手順を要約すると以下になります。IDLファイルとweb-sysのビルドスクリプトを置く別のクレートからバインディングを含むクレートを使う(クレートが2つ必要なのはwasm-bindgenの内部仕様による制限です。追っていませんが、内部で後処理に使っているハッシュ値を別々にしておく必要があるようです。コードはGitHubに置きました。APIは今のところChromeでしか使えませんのであしからず。IDLを元に簡単なメソッドを実装してみます。Clipboard.readText()はクリップボードからテキストを読みだしてテキストをPromiseにくるんで返すメソッドです。IDLをweb-sysと同じようなディレクトリ構造をもったクレートに置きます。clipboard.webidlbuild.rsはweb-sysのビルドスクリプトをコピーして一部改変したものです。lib.rsには基本的に生成したバインディングをincludeする記述を書くだけです。interfaceを外部から定義するのを許していないのでちょっとした工夫を入れます。具体的にはnavigator.clipboardを手軽に使えるようにトレイトとその実装を加えます。別のトレイトを用意してそこから使います。text.into()}これでひと段落しました。read_text_from_clipboard()をJS側から呼ぶとクリップボードのテキストがPromiseにくるまれて返ってきます。APIには画像をやり取りするAPIもあります。こちらはもう少し複雑で、別のインタフェース(ClipboardItem)を定義してあげる必要があります。ここでは説明しませんが、GitHubに置いたコードでは画像を扱う例も書いていますので興味があれば参考にしてみてください。upLoginユーザーは見つかりませんでした。