Homework diary 📔
最終更新
役に立ちましたか?
最終更新
役に立ちましたか?
2023年5月に開催されたのプロジェクトをRust言語で実装します。
Rustのプロジェクト「day2」を作成します。cargo new
コマンドを--lib
オプションを付与して実行します。
生成されたファイルは以下の通りです。
ライブラリを使用します。最新バージョンでよいかと思いますので、以下のように実行ます。
candid、serdeは、CandidType, Deserialize指定に必要?
Canister上から関数が正しく呼び出させるようcrate-typeをcdylib
にします。
Canisterの定義を行います。
dfx.jsonの [canisters] > [day2] > [candid]項目に指定したファイルに、Canisterに配置するDappが提供する関数のI/Fを定義します。
2023/06/23追記:
cargo new
コマンドで生成されたlib.rsの中身をクリアして、day2用のプログラムを作成します。
addHomework()
getHomework()
updateHomework()
markAsCompleted()
deleteHomework()
getAllHomework()
getPendingHomework()
searchHomework()
Rust言語仕様の理解が十分でないため、作成したソースコードは所有権まわりをはじめ最適化されていない可能性がありますのでご注意ください。もしも、おかしな実装等が見つかりましたらが、ご指摘いただけますとさいわいです。
Rustではソース内にUnitテストコードを含めて記述することができます。
TODO: 今回の範囲ではロジックにIC色は無いため、UnitテストはLocal canisterに配備せずそのまま実行する方法としましたが、Canisterに配置したテストの方法は未調査。
Local Canisterを起動します。
--background
オプションでサービス常駐でき、--clean
を付与すると真っ新な状態でLocal canisterを起動できます。
に相当するcandidを用意します。
Motokoのはint (System time is represent as nanoseconds since 1970-01-01.)のようで、Rust言語ではint128でOKと思われます。
Local caniterに配備してCandid UIで結果を見ると、motokoのはvariant {ok:xxx, err:text}
(先頭小文字)となりますが、Rustのはvariant {Ok:xxx, Err:text}
(先頭大文字)の違いがあるようです。
そのため、candid定義を Motoko に合わせて、variant { ok:Homework; err: text }
とするとRust側でResultを返す際にマッピングエラーとなってしまい、と完全一致とはなりません。
氏より教えていただいた情報より、MotokoのResultに合わせるためにはRust標準のstd::Resultを使用せず、Motokoに合わせてenum型を用意する必要があるようです。
本ドキュメントではstd::Result型を使用する方法説明しますが、MotokoとI/Fを合わせる場合には、氏の内容が参考になります。
と同じように、以下の関数を実装します。