# materialize とエラー 通常の評価結果には constraint、`default`、function などが残り得る。 materialize は評価結果を外部へ渡せる concrete data に変換する。 ## materialize の規則 materialize は次の処理を行う。 - 必要な field を評価する。 - 明示値のない abstract range に `default` を適用する。 - concrete value と採用した `default` が constraint を満たすか検証する。 - `default` のない `Unknown` や他の未解決 range を拒否する。 - 未適用の function など、data に変換できない値を拒否する。 ```dcdl Service = { host = String; port = Int default 8080; }; ``` `Service` をそのまま materialize すると、`host` に concrete value も `default` もないため失敗する。 ```dcdl Config = { host = "localhost"; } as Service; ``` `Config` を materialize すると次の data になる。 ```dcdl { host = "localhost"; port = 8080; } ``` 明示値がある field では `default` は採用されない。 ## Diagnostics エラーは通常の値ではなく diagnostic として返される。 式は diagnostic の種類や内容に基づいて分岐できない。 代表的な diagnostic は次の通りである。 - syntax error - unresolved identifier または field - type mismatch と constraint violation - `&` または `default` の conflict - cycle dependency - import failure - match failure - materialization failure diagnostic は問題のある DCDL source span を示す。 複数の式が conflict した場合は、関係する field、constraint、value、`default` の位置も示される。 structured import の値に source span がない場合は、host が返した stable key と logical value path が示される。 ## Fallback `match` に fallback arm がなく、どの arm にも一致しない場合は diagnostic になる。 ```dcdl match value { >= 10: "large"; } ``` Decodal は diagnostic を捕捉する汎用 `try / catch`、optional import、optional field access を提供しない。 値がない場合の fallback は `default`、有限の値分岐は `match` で表現する。