# 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 も許容される。runtime と materialize 後の表現は通常の object と共通であり、別の map value variant は持たない。 ```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 があればエラーになる。 名前付き field を持たない `{...T}` は従来どおり抽象的な map constraint であり、単独でmaterializeするにはdefaultまたは具体値が必要になる。