本文へスキップ

拡張の作成

Rust アプリは通常のモジュールを共有できます。あるいは、Go と TypeScript のアプリが読み込むネイティブ拡張を作れます。Rust アプリは、設定に extensions を並べる代わりにクレート機能を有効にします。

#拡張の種類を選ぶ

追加するもの配布するもの
コンポーネントまたはアプリケーションロジックRust モジュールまたはクレート
任意の QuickGUI 機能updater や terminal などの Cargo features
Go または TypeScript 向けのネイティブサービスcdylib、マニフェスト、型付きラッパー

Rust の アプリ はすでに quickgui をリンクしています。別のホストライブラリは読み込みません。

#拡張プロジェクトを作成する

quickgui init-extension my-extension --type rust

Go または 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 を直接呼び出します。