Files
Decodal/doc/manual/souce/language/expression/object.md
T

2.4 KiB

Object Expression

object expression は、名前付き field の集合を表す。

{
    host = "127.0.0.1";
    port = 8000;
}

object は設定値にもスキーマにも使う。

MyConfig = {
    host = String;
    port = Int default 8080;
};

Dot-path Field

ネストした field はドットパスでも定義できる。

{
    feature_hoge.enable = false;
}

これは以下と同じ構造を表す。

{
    feature_hoge = {
        enable = false;
    };
}

Map constraint

連想配列の制約は、object の任意の field value に同じ schema を適用する。

Services = {...{
    port = Int;
    enabled = Bool default true;
}};

{...T} は key の集合を固定せず、すべての value が T を満たす object を表す。 空 object も許容される。materialize 後は named fields を持つ object と同じ object data になる。

services = {
    api = { port = 8080; };
    worker = { port = 8081; enabled = false; };
} as Services;

各 entry は as によって右辺の field domain 内へ絞り込まれるため、左辺に portenabled 以外の field があればエラーになる。 右辺にしかない field は default の有無にかかわらず abstract のまま残る。 host から渡した object は識別子構文に収まらない文字列 key も保持できるが、DCDL source の object field name は通常の識別子に限られる。

Object rest constraint

固定 field と任意 key の value range は、一つの object に混在できる。

OpenConfig = {
    enabled = Bool default true;
    ...Unknown
};

...T は明示されていない残余 field にだけ適用する。明示 field にはそれぞれの field range を適用し、rest range を重ねて適用しない。 rest constraint は field を生成せず、materialize 時には実際に存在する追加 field だけを出力する。

{
    enabled = false;
    plugin = { name = "cache"; };
} as OpenConfig

...T は object の末尾に一つだけ書ける。省略した object は閉じており、as の左辺に未宣言 field があればエラーになる。 named field を持たない {...T} は abstract な map constraint であり、単独で materialize するには default または concrete value が必要になる。