🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
/*!
|
||
* Frag 検証関数(Phase 264: Fail-Fast の置き場所)
|
||
*
|
||
* Phase 264 では空実装。
|
||
* 実装適用時(Phase 265+)に検証項目を段階的に追加。
|
||
*/
|
||
|
||
use super::frag::Frag;
|
||
|
||
/// Frag の不変条件を検証(Phase 265 P0: 最小チェック)
|
||
///
|
||
/// # 検証項目
|
||
/// - Phase 265 P0: exits が空でないか(最低限の健全性)
|
||
/// - Phase 265 P1+: EdgeStub.from の有効性、edge-args の整合性
|
||
///
|
||
/// # 戻り値
|
||
/// - Ok(()): 検証成功
|
||
/// - Err(String): 検証失敗(エラーメッセージ)
|
||
///
|
||
/// # Phase 265 P0
|
||
/// - デバッグガード付き最小実装(デフォルト出力は汚さない)
|
||
/// - 不変条件は edgecfg-fragments.md に文書化済み
|
||
pub fn verify_frag_invariants(frag: &Frag) -> Result<(), String> {
|
||
// Phase 265 P0: 最小チェック(デバッグビルドのみ出力)
|
||
|
||
// 1. exits が空でないか(最低限の健全性)
|
||
if frag.exits.is_empty() {
|
||
#[cfg(debug_assertions)]
|
||
eprintln!(
|
||
"[verify_frag] Warning: Frag entry={:?} has no exits (dead end?)",
|
||
frag.entry
|
||
);
|
||
}
|
||
|
||
// 2. entry の有効性(デバッグビルドのみ)
|
||
#[cfg(debug_assertions)]
|
||
{
|
||
if crate::config::env::is_joinir_debug() {
|
||
eprintln!(
|
||
"[verify_frag] Frag entry={:?}, exits={} kinds",
|
||
frag.entry,
|
||
frag.exits.len()
|
||
);
|
||
for (kind, stubs) in &frag.exits {
|
||
eprintln!(
|
||
"[verify_frag] {:?}: {} stubs",
|
||
kind,
|
||
stubs.len()
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
// P1+: より厳格な検証を追加
|
||
// - EdgeStub.from の有効性(実際のブロックID範囲チェック)
|
||
// - edge-args の長さ一致
|
||
// - terminator 語彙との整合性
|
||
|
||
Ok(())
|
||
}
|