拡張の作成
Rust アプリは通常のモジュールを共有できます。あるいは、Go と TypeScript のアプリが読み込むネイティブ拡張を作れます。Rust アプリは、設定に extensions を並べる代わりにクレート機能を有効にします。
#拡張の種類を選ぶ
| 追加するもの | 配布するもの |
|---|---|
| コンポーネントまたはアプリケーションロジック | Rust モジュールまたはクレート |
| 任意の QuickGUI 機能 | updater や terminal などの Cargo features |
| Go または TypeScript 向けのネイティブサービス | cdylib、マニフェスト、型付きラッパー |
Rust の アプリ はすでに quickgui をリンクしています。別のホストライブラリは読み込みません。
#拡張プロジェクトを作成する
quickgui init-extension my-extension --type rustGo または TypeScript のアプリがネイティブサービスを使うときに、これを使います。--npm-package は成果物パッケージ名を設定します。
#コンポーネントの共有
Element を返す関数をエクスポートします:
use quickgui::{Color, Element, text};
pub fn notice(message: impl Into<std::sync::Arc<str>>) -> Element {
text(message)
.p(12.0)
.bg(Color::rgb8(239, 246, 255))
.text_color(Color::rgb8(30, 64, 175))
.rounded(8.0)
}子として notice("Saved") を返します。アプリ全体のサービスは View::render の外に置きます。
#ネイティブ拡張の構成
ネイティブ拡張は quickgui.extension.json、バージョン付き共有ライブラリ、宣言したリソースを配布します。Rust 拡張は extension_api.rs をベンダーし、レンダラーをリンクせずに cdylib をビルドできます。ネイティブインターフェースについては、Go の 拡張の作成 ガイドを参照してください。
#依存関係の宣言
Rust アプリケーションは Cargo.toml で機能を有効にします。プロジェクトにあるクレートのバージョンはそのままにします:
[dependencies]
quickgui = { version = "...", features = ["terminal"] }Go と TypeScript の利用側は、それぞれの設定で拡張パッケージを宣言します。
#ネイティブインターフェースを実装する
invoke と shutdown を実装します。返す前に借用している入力をコピーし、イベントはそれぞれのセッションに限定し、セッションが止まるとワーカーを解放します。
#自動登録
Go と TypeScript の CLI は、宣言された拡張をバンドルします。Rust アプリに追加で登録するものはありません。Cargo が依存しているクレートをリンクします。
#成果物のビルドとパッケージ化
アプリの編集は、選択したクレートを再ビルドします。ネイティブ実装が変わったら拡張を再ビルドし、そのあと利用側の Go または TypeScript アプリを再ビルドします。
#テストと配布
パッケージ済みの cdylib は、生成されたデモアプリでテストします。Rust アプリケーションは invokeExtension ではなく、クレート API を直接呼び出します。
