Calculator ➕✖️➖➗
2023年5月に開催されたMotoko Bootcamp Day 1のプロジェクトをRust言語で試してみました。
Local Canisterへの配備まで実施した手順を記載します。
1. Rustプロジェクト作成
Rustのプロジェクト「day1」を作成します。cargo new
コマンドを--lib
オプションを付与して実行します。
生成されたファイルは以下の通りです。
2. Cargo.tomlの編集
(1) IC関連ライブラリ追加
ic-cdkを使用します。最新バージョンでよいかと思いますので、以下のように実行ます。
(2) crate-type設定
Canister上から関数が正しく呼び出させるようcrate-typeをcdylib
にします。
3. dfx.jsonの作成
Canisterの定義を行います。
dfx.jsonの記述に関する公式ドキュメントはこちらが参考になります。
4. candidの作成
dfx.jsonの [canisters] > [day1] > [candid]項目に指定したファイルに、Canisterに配置するDappが提供する関数のI/Fを定義します。
Motoko Bootcamp Day1 📺 Interfaceに相当するcandidを用意します。
参考:Candidリファレンス
5. lib.rsの編集
cargo new
コマンドで生成されたlib.rsの中身をクリアして、day1用のプログラムを作成します。
Motoko Bootcamp Day1と同じように、以下の関数を実装します。
add()
sub()
mul()
div()
reset()
see()
power()
sqrt()
floor()
Canister内部で保持するデータは、公式チュートリアル・サンプルにもあるように、「thread_local!」内で管理すると良いようです。
6. Unitテスト
Rustではソース内にUnitテストコードを含めて記述することができます。
TODO: 今回の範囲ではロジックにIC色は無いため、UnitテストはLocal canisterに配備せずそのまま実行する方法としましたが、Canisterに配置したテストの方法は未調査。
補足
assertによる一致判定を行う際、assert_eq!(expected, actual)
なのか、assert_eq!(actual, expected)
なのかは議論がありますが、Rust公式ドキュメントのMacro std::assert_eqのExamplesや、JUnitなどの流れから、前者としています。
7. Local Canisterの起動
Local Canisterを起動します。
--background
オプションでサービス常駐でき、--clean
を付与すると真っ新な状態でLocal canisterを起動できます。
8. Local Canisterへの配備
Cargo.lockが無い場合
Cargo.lockがディレクトリに存在しない場合、dfx deploy
がエラーとなります。
その場合、たとえば、以下のように作成するとよいでしょう。
作成資材
Cargo.lock
Cargo.toml
day1.did
dfx.json
src/lib.rs
dfx start
コマンドを実行すると.dfx
ディレクトリが作成されます。cargo test
コマンドを実行するとtarget/debug
ディレクトリが作成されます。dfx deploy
コマンドを実行するとtarget/release
ディレクトリ、およびtarget/wasm32-unknown-unknown
が作成されます。
最終更新