Dev Study
← 解説「失敗を型にする — UrlError と Result で「どう壊れていたか」を返す」に戻る

サンプルコードで身につける: 失敗を型にする — UrlError と Result で「どう壊れていたか」を返す

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1失敗の理由を enum にする

parse の戻り値を <Url, UrlError> にし、失敗の理由を 4 つの variant(MissingScheme / UnsupportedScheme / EmptyHost / InvalidPort)で返します。関数の中では ok_or と ? で「None ならここで Err を返す」、 と ? で「数値変換の失敗をこの層の型に言い換える」を使っています。実行すると 6 本の入力のうち 1 本が ok、5 本が NG になり、NG はそれぞれ別の理由の文で出るので、呼ぶ側が で理由ごとに分岐できることが文字列のエラーとの違いだと分かります。

Rust

2表で固めるテスト

Url と UrlError に PartialEq を すると、(parse(input), Err(UrlError::EmptyHost)) のように Ok/Err をまるごと比べられます。入力と期待値の表 cases() を 1 つ作り、 の中の と main の両方から使うので、 では assert_eq! で、テストランナーが無いこの実行では main が同じ表を回して検査します。実行すると 7 件すべて ok、NG 0 件と出ます。

Rust

3実務: 設定ファイルの URL を一括検証する

UrlError に Display を実装し、? と map_err で「何行目のどのキーが、なぜ」まで足して上の層へ流します。KEY= の形の設定を 7 行読み、正しい行は ok、壊れた行は理由を集めて最後にまとめて出すので、実行すると ok 2 件、NG 5 件( の未対応・スキーム無し・ 9090a・空・KEY=URL でない行)がそれぞれ別の文で報告されます。デプロイ前の設定チェックや CI の lint で同じ形を使います。

Rust

図やコードに出てくる用語(タップで説明)