74 lines
2.1 KiB
Markdown
74 lines
2.1 KiB
Markdown
# 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` で表現する。
|