2.1 KiB
2.1 KiB
materialize とエラー
通常の評価結果には constraint、default、function などが残り得る。
materialize は評価結果を外部へ渡せる concrete data に変換する。
materialize の規則
materialize は次の処理を行う。
- 必要な field を評価する。
- 明示値のない abstract range に
defaultを適用する。 - concrete value と採用した
defaultが constraint を満たすか検証する。 defaultのないUnknownや他の未解決 range を拒否する。- 未適用の function など、data に変換できない値を拒否する。
Service = {
host = String;
port = Int default 8080;
};
Service をそのまま materialize すると、host に concrete value も default もないため失敗する。
Config = {
host = "localhost";
} as Service;
Config を materialize すると次の data になる。
{
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 になる。
match value {
>= 10: "large";
}
Decodal は diagnostic を捕捉する汎用 try / catch、optional import、optional field access を提供しない。
値がない場合の fallback は default、有限の値分岐は match で表現する。