【開発レポート】Rustで挑む「理想のWebフレームワーク」構築その3 – 宣言的UIとCLIの召喚

【開発レポート】Rustで挑む「理想のWebフレームワーク」構築その3 – 宣言的UIとCLIの召喚

お疲れ様です、tomaです。

前回の「レポート2.5」では、ToDoアプリの実装を通じてフレームワークの実用性をテストしました。
そこで得た知見と、湧き上がってきた「もっと楽をしたい」という欲求に従い、今回はフレームワークの心臓部である 管理画面(Admin UI) に、決定的な進化をもたらしました。

今回のテーマは 「宣言的UI」「黒い画面(CLI)の整備」 です。
Rustのマクロという魔導書を書き換えることで、Djangoの admin.pyforms.py に限りなく近い開発体験を実現した記録を残します。

1. ボイラープレートの終焉:Generic ModelForm

これまで、新しいモデル(テーブル)を追加するたびに、HTMLフォームの定義や変換ロジックを手動で書いていました。
しかし、Djangoユーザーならこう思うはずです。「モデルがあるなら、フォームは勝手にできてほしい」と。

そこで、新たなマクロ impl_model_form! を実装しました。

  • 自動生成:SeaORMのモデル定義から、入力フォーム (FromForm) を自動生成します。
  • ウィジェット制御widget: passwordwidget: textarea と指定するだけで、HTML側の input タグが適切に切り替わります。
  • Many-to-Many対応:面倒な中間テーブルの保存処理(m2m 属性)も、マクロが裏側で処理します。

これにより、開発者は「どんなデータが欲しいか」を宣言するだけで、堅牢な入力フォームを手に入れることができるようになりました。

2. テンプレートの統一:千の顔を持つ form.html

以前は user_form.htmlgroup_form.html とモデルごとにテンプレートファイルを作成していましたが、これは明らかに無駄でした。
今回のアップデートで、これらを単一の admin/form.html.tera に統合しました。

仕組みはこうです:
バックエンドから「このフィールドはテキスト、あっちは日付」というメタデータ(FieldMetadata)を注入し、テンプレート側でそれを解釈して動的にレンダリングします。
これにより、新しい管理画面を追加する際、HTMLを一行も書く必要がなくなりました。

3. 検索機能の実装:impl_list_view!

管理画面にデータが並ぶと、次に欲しくなるのは「検索」です。
ここでも宣言的なアプローチを採用しました。

search_fields: [Name, Description]

マクロにこのように記述するだけで、汎用的な検索バーが有効になり、SQLの LIKE 検索クエリが自動的に発行されます。
Djangoの search_fields = ['name'] と全く同じ感覚です。

4. CLIツールの召喚:createsuperuser

Webブラウザの外側にも装備を整えました。
開発初期や運用時に必須となる管理者ユーザーの作成。これまではSQLを直接叩いていましたが、ついにCLIツールを実装しました。

cargo run -- createsuperuser

技術的には clap で引数を解析し、rpassword でパスワードを安全に入力(エコーバックなし)、そして argon2 でハッシュ化して保存しています。
「コマンド一発で管理者が作れる」。地味ですが、フレームワークとしての体裁がグッと整いました。

5. まとめ:パズルが組み上がってきた

今回の改修で、管理画面の開発工数は当初の1/10以下になった感覚です。
「モデル定義」と「数行のマクロ記述」だけで、検索付きの一覧画面と、バリデーション付きの編集フォームが立ち上がる。
Rustの型安全性とパフォーマンスを維持したまま、この生産性を手に入れられたのは大きな成果です。

次なる課題は、バリデーションエラー表示のさらなるリッチ化や、マクロの内部構造(proc-macro化)の改善です。
理想のWebフレームワークへの道はまだ続きますが、足取りは確実に軽くなっています。

それでは、また次のセーブレポートで。
toma

Comments

No comments yet. Why don’t you start the discussion?

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です