Docsの目次

自作ライブラリとRustの資産を使う

Nagiでアプリの処理を書き、共通の関数を別ファイルにまとめたり、Rustのライブラリを呼んだりできます。よく使う処理はNagiのAPIで提供し、高度な処理はRustアダプターで拡張する方針です。以下では、現在使えるファイルimportとRust連携を説明します。

このページの目次

共通の処理を複数のアプリで使う

料金計算CLIとJSONレポートは、同じ料金計算ライブラリを読み込みます。共通のNagiファイルが入力の検証と公開する型を決め、Rust側に計算の実装を置いています。

library-examples/
  shared/              共通のNagi宣言とRustの実装
  foundation-cli/      入力を受け取って見積もるアプリ
  foundation-report/   複数の見積もりをJSONにするアプリ

import "../shared/foundation.nagi"のように相対パスで共通ファイルを読み込みます。Rustの入口は各アプリのnagi.tomlに指定し、そのRustファイルから共通モジュールを読み込みます。サンプルはディレクトリ一式で使ってください。

この従来のimportは定義を同じ名前空間へ読み込みます。import "../shared/foundation.nagi" as foundationでmodule名を付けると、foundation.関数名でそのファイル自身の定義を使えます。from文でclassや関数に別名を付けることもできます。moduleの例は、別ファイルの同名classを区別します。Cargoのcrateとしての配布や、Nagiのパッケージ管理とは別の仕組みです。

Rustライブラリとの境界を小さくする

Rust連携のリファレンスに、@rust・extern def・型の対応をまとめています。

Rustのcrateを使うときは、Rust側にNagiから呼ぶ関数を用意します。その関数でcrate固有の型をNagiの数値・文字列・class・Resultへ変換すると、アプリ側はRustの実装の詳細を知らずに使えます。

JSON読込では、serde_jsonがNagiのclassに対応するJSONを読みます。入力の文字列は借り、形式が合わない場合はResultの失敗を返します。非同期処理では、TokioのtimerをNagiからawaitします。

Nagiのcheckが検査するのは宣言と呼び出しです。Rustの関数との型の一致はbuildで検査します。Rustの任意の型、trait、genericをそのままNagiから使う仕組みではありません。利用者がopaque resource型を登録する仕組みも未対応です。Rust側のblocking処理や独自の共有状態は、そのライブラリ側で管理します。

アプリの処理をRust側から呼ぶ

引数に同期関数の型を宣言すると、Nagiの関数をRustへ渡せます。自作HTTP基盤はこの方法を使います。

HTTPの受付と停止はRustのAxum/Tokio、応答を作る関数はNagiが担当します。Nagiの組み込みserveやsqlite.Poolを使わずに、Rust側の基盤にアプリの処理を渡す例です。

このサーバーには、Nagiの組み込みHTTPサーバーの制限が自動で適用されません。サンプルが設定する上限はREADMEに記載しています。また、現在の生成アプリは共通ランタイムへ依存するため、sqlite.Poolを呼ばないプログラムでもビルド時のSQLite依存は残ります。

Highの実装をLowへ置き換える

Low計算カーネルは、Highの呼び出しを変えずに、同じ型のLow実装へ置き換えます。Rustライブラリを追加せず、Nagi内で実装を差し替える方法です。

実装をLowに移すだけで速くなるとは限りません。結果の一致を確認し、必要な箇所で速度や割り当てを測定してください。

ライブラリ利用で今後整えること

以下は設計対象であり、現在使える設定・文法ではありません。

  • 自作ライブラリのpackage探索と公開範囲の指定。相対ファイルのas・fromと、登録済み標準moduleの引用符なしimportは既に使える。
  • HTTP・DBを用途に応じて選べる標準ライブラリに分け、使わない依存をビルドから外す。
  • 自作の接続・clientなどを扱う型について、所有権・共有・終了・asyncの取消しの規則を決める。
  • SQLiteとPostgreSQLを別module・別接続型で提供し、型付きのSQL引数・行の読込・エラー処理の規則を揃える。SQL方言やtransactionの違いは隠さない。

既存のファイルimport・extern・SQLiteの呼び出しを使うコードを保ちながら、これらの設計を確認して進めます。具体的な設計案とサンプル一覧があります。

Nagi 0.2.0 · Docsこのページのソース