Decodal/doc/manual/souce/language/examples.md

1.9 KiB

この章には、仕様を説明するための例を置く。

基本的な設定スキーマ

Host = IPv4Address;

Port = Int & >= 1 & <= 65535;
NarrowedPort = Port & > 443;

MyConfig = {
    host = Host;
    port = NarrowedPort default 8080;
    feature_hoge = {
        enable = Bool default true;
        fuga = Int default 10;
    };
};

NewConfig = MyConfig & {
    host = "127.0.0.1";
    port = 8000;
};

disabled_config = NewConfig & {
    feature_hoge.enable = false;
};

enabled_config = NewConfig;

関数と制約

let
    Port = Int & >= 1 & <= 65535;
    add_offset = (base: Port, offset: Int) => base + offset;
in
    add_offset(8000, 80)

評価結果:

8080

match

(
    input_a: {
        hoge = Int & >= 0;
    },
    input_b: {
        fuga = 20;
    }
) =>
let
    inputs = {
        a = input_a;
        b = input_b;
    };
in
{
    foo = match inputs.a.hoge {
        >= 20: {
            value = 200;
        };
        >= 10: {
            value = 100;
        };
        _: {
            value = 300;
        };
    };
}

match は上から順に評価されるため、広い条件より狭い条件を先に書く。

deep patch

Base = {
    feature_hoge = {
        enable = Bool default true;
        fuga = Int default 10;
    };
};

Patched = Base // {
    feature_hoge.enable = false;
};

Patched は以下に相当する。

{
    feature_hoge = {
        enable = false;
        fuga = Int default 10;
    };
}

循環 import

# main.n
{
    schema = {
        hoge = String;
    };

    result = (import ./func.n)(schema);
}
# func.n
(input: (import ./main.n).schema) =>
{
    # ...
}

func.nmain.n を import しているが、参照しているのは main.schema である。 main.schemamain.result に依存していなければ、この循環 import は成立する。