error:
- stdlib
全体 で共通 に使 うDiag/Diags/Outcome/StdErrorKindを定義 します。 Result<T, E>の軽量 な失敗 制御 と、Diagによる構造化 診断 を分離 します。
Diagはkind/message/span/notes/help/sourceを持 つ struct です。DiagsはVec<Diag>を包 む struct とし、順序 付 きで複数 の診断 を保持 します。Outcome<T, E>はresultとdiagsを持 ち、値 の成否 と診断 を別軸 で運 びます。
- ここは
表示 のためのライブラリではなく、診断 値 の定義 を担 います。 Result<T, Diag>は通常 のライブラリ API で、Outcome<T, E>は compiler や JSON/HTML処理 のような richer な処理 で使 うことを想定 します。StdErrorKindは軽量 な失敗 分類 であり、Diag.kindが持 つ詳細 情報 を置 き換 えるものではありません。
Diag/DiagKind/Span/Outcomeの構築 は O(1) です。Diagsの push はならし O(1)、最悪 O(n)(再確保 を含 む)です。
DiagLevel:
log/info/warn/errorの 4段階 で報告 の重 さを表 します。
- これは
ResultのOk/Errとは別軸 です。
- O(1)
StdErrorKind: stdlib
Result<T, E>のEとして使 う標準 の error kind を定義 します。- stdlib
横断 で大 まかな失敗 要因 を揃 えて扱 えるようにします。
詳細 な背景 や位置 はDiag側 で補 います。
- O(1)
Span:
- file/start/end の 3
要素 で位置 情報 を保持 します。
file_idの意味 づけは呼 び出 し側 が定義 します。
- O(1)
DiagKind:
共通 の重大度 と stdlib共通 の error kind、さらに任意 の local kind を束 ねます。
std_errorとlocal_kindはどちらか片方 だけでも構 いません。階層 識別子 の言語 機能 が入 るまでは、local_kindはstrとして扱 います。
- O(1)
Diag:
診断 1件 ぶんの分類 ・本文 ・補足 情報 をまとめます。
notesとhelpはVec<str>で保持 します。sourceは由来 の記述 を指 す任意 の文字列 です。
Diagは表示 そのものではなく、構造化 された診断 値 です。
構築 は O(1) です。
Diags:
Diagの列 を単 なるVec<Diag>として露出 せず、診断群 として扱 います。
itemsにVec<Diag>を保持 します。
構築 は O(1) です。
Outcome: Result と Diags を
- compiler や source code を
伴 う richer な処理 で、値 の成否 と診断 を一緒 に返 します。
通常 の stdlib API ではResultで十分 なことが多く、Outcomeは限定的 に使 います。diagsはOption<Diags>とし、必要 なときだけ持 たせます。
構築 は O(1) です。
diag_kind_new: DiagKind を
std_error_kind: StdErrorKind を
log_kind: local kind
info_kind: local kind
warn_kind: local kind
diag_new:
diag_log: log
diag_info: info
diag_warn: warn
diag_error: StdErrorKind
diag_with_span:
diag_with_source:
diag_add_note: note を 1
diag_add_help: help を 1
diag_level:
diag_std_error_kind: StdErrorKind を
diag_std_error_kind_str: StdErrorKind の
diag_err: Diag を Result::Err に
diag_out_of_memory:
diag_empty_collection:
diag_capacity_exceeded:
diag_key_not_found:
diags_new: Diags を
diags_one: Diag 1 Diags を
diags_push: Diags に Diag を 1
diags_len:
diags_has_errors: error level の
outcome_ok:
outcome_err:
outcome_with_diags:
result_to_outcome: Result をOutcome に
into_outcome: Result を Outcome に
目的
ResultとOutcomeを同 じ helper名 で扱 い、呼 び出 し側 が必要 な時点 でOutcomeに揃 えられるようにします。
使用例
#entry main
#target std
#import "std/test" as *
#import "alloc/diag/error" as *
fn main <()*>i32> ():
let o <Outcome<i32, StdErrorKind>> into_outcome Result::Ok<i32, StdErrorKind> 7;
assert outcome_is_ok o;
0実装
result_to_outcomeをそのまま呼 び、診断 群 なしのOutcomeを返 します。
注意
Result側 に診断 群 はないため、昇格 してもdiagsはnoneです。
計算量
時間 : O(1)空間 : O(1)
into_outcome: そのまま Outcome を
目的
- すでに
Outcomeを持 っている値 もResultと同 じ helper名 で扱 えるようにします。
実装
入力 をそのまま返 します。
注意
diagsの有無 は保持 されます。
計算量
時間 : O(1)空間 : O(1)
result_like_result: Result をそのまま
目的
Result/Outcomeを共通 helper で扱 うとき、成否 の軸 だけを同 じ名前 で取 り出 せるようにします。
実装
入力 のResultをそのまま返 します。
計算量
時間 : O(1)空間 : O(1)
result_like_result: Outcome Result を
目的
Outcome内部 のresultfield をResultと同 じ名前 で取 り出 せるようにします。
実装
outcome_resultを呼 びます。
計算量
時間 : O(1)空間 : O(1)
result_like_is_ok: Result の
result_like_is_ok: Outcome の
result_like_is_err: Result の
result_like_is_err: Outcome の
outcome_result: Outcome Result を
Outcomeを受 け取 った呼 び出 し側 が、診断 群 とは別 に成否 だけを確認 できるようにします。ResultとOutcomeを共通 helper で扱 うときの読 み取 り入口 として使 います。
neplg2:test
#entry main
#target std
#import "std/test" as *
#import "alloc/diag/error" as *
fn main <()*>i32> ():
let o <Outcome<i32, StdErrorKind>> outcome_ok<i32, StdErrorKind> 42;
match outcome_result o:
Result::Ok v:
assert_eq_i32 42 v;
Result::Err _e:
test_fail "expected ok";
0- struct field
resultをそのまま返 します。
diagsは返 さないので、診断 群 も見 たい場合 はoutcome_diags_or_emptyを併用 します。
時間 : O(1)空間 : O(1)
outcome_is_ok: Outcome.result が Ok か
値 の成否 だけを短 く読 み取 りたい場面 で、matchを省 いて使 えるようにします。
outcome_result oをmatchし、Result::Okなら true を返 します。
diagsに warning や error が含 まれていても、resultがOkなら true です。診断 群 の重大度 はoutcome_has_errorsで別途 に確認 します。
時間 : O(1)空間 : O(1)
outcome_is_err: Outcome.result が Err か
軽量 な失敗 制御 だけを見 たい場面 で、ResultのErrかどうかを即座 に調 べられるようにします。
outcome_is_okの否定 を返 します。
Outcomeの診断 群 とは独立 です。
時間 : O(1)空間 : O(1)
outcome_diags_or_empty: Outcome のDiags に
Outcomeを使 う側 がOption<Diags>をそのつどmatchせず、一貫 してDiagsとして扱 えるようにします。
someならそのまま返 し、noneならdiags_newを作 ります。
noneのときは空 Diagsを新規 確保 します。
時間 : O(1)空間 : O(1)
outcome_has_errors: Outcome の
- compiler や richer な parser が
Outcome.resultとは別 に、診断 群 の重大度 で処理 継続 を判断 するときに使 います。
diagsがnoneなら false、someならdiags_has_errorsを呼 びます。
Result::Errであってもdiagsが空 なら false を返 します。Outcome.resultの成否 とDiagLevel::Errorは別軸 です。
時間 : O(n)空間 : O(n)(再帰 ぶん)
std_error_kind_str: StdErrorKind を
diag_level_str: DiagLevel を