89 lines
2.4 KiB
Markdown
89 lines
2.4 KiB
Markdown
# Object Expression
|
|
|
|
object expression は、名前付き field の集合を表す。
|
|
|
|
```dcdl
|
|
{
|
|
host = "127.0.0.1";
|
|
port = 8000;
|
|
}
|
|
```
|
|
|
|
object は設定値にもスキーマにも使う。
|
|
|
|
```dcdl
|
|
MyConfig = {
|
|
host = String;
|
|
port = Int default 8080;
|
|
};
|
|
```
|
|
|
|
## Dot-path Field
|
|
|
|
ネストした field はドットパスでも定義できる。
|
|
|
|
```dcdl
|
|
{
|
|
feature_hoge.enable = false;
|
|
}
|
|
```
|
|
|
|
これは以下と同じ構造を表す。
|
|
|
|
```dcdl
|
|
{
|
|
feature_hoge = {
|
|
enable = false;
|
|
};
|
|
}
|
|
```
|
|
|
|
## Map constraint
|
|
|
|
連想配列の制約は、object の任意の field value に同じ schema を適用する。
|
|
|
|
```dcdl
|
|
Services = {...{
|
|
port = Int;
|
|
enabled = Bool default true;
|
|
}};
|
|
```
|
|
|
|
`{...T}` は key の集合を固定せず、すべての value が `T` を満たす object を表す。
|
|
空 object も許容される。materialize 後は named fields を持つ object と同じ object data になる。
|
|
|
|
```dcdl
|
|
services = {
|
|
api = { port = 8080; };
|
|
worker = { port = 8081; enabled = false; };
|
|
} as Services;
|
|
```
|
|
|
|
各 entry は `as` によって右辺の field domain 内へ絞り込まれるため、左辺に `port` や `enabled` 以外の field があればエラーになる。
|
|
右辺にしかない field は default の有無にかかわらず abstract のまま残る。
|
|
host から渡した object は識別子構文に収まらない文字列 key も保持できるが、DCDL source の object field name は通常の識別子に限られる。
|
|
|
|
## Object rest constraint
|
|
|
|
固定 field と任意 key の value range は、一つの object に混在できる。
|
|
|
|
```dcdl
|
|
OpenConfig = {
|
|
enabled = Bool default true;
|
|
...Unknown
|
|
};
|
|
```
|
|
|
|
`...T` は明示されていない残余 field にだけ適用する。明示 field にはそれぞれの field range を適用し、rest range を重ねて適用しない。
|
|
rest constraint は field を生成せず、materialize 時には実際に存在する追加 field だけを出力する。
|
|
|
|
```dcdl
|
|
{
|
|
enabled = false;
|
|
plugin = { name = "cache"; };
|
|
} as OpenConfig
|
|
```
|
|
|
|
`...T` は object の末尾に一つだけ書ける。省略した object は閉じており、`as` の左辺に未宣言 field があればエラーになる。
|
|
named field を持たない `{...T}` は abstract な map constraint であり、単独で materialize するには `default` または concrete value が必要になる。
|