133 lines
1.9 KiB
Markdown
133 lines
1.9 KiB
Markdown
# 例
|
|
|
|
この章には、仕様を説明するための例を置く。
|
|
|
|
## 基本的な設定スキーマ
|
|
|
|
```dcdl
|
|
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;
|
|
```
|
|
|
|
## 関数と制約
|
|
|
|
```dcdl
|
|
let
|
|
Port = Int & >= 1 & <= 65535;
|
|
add_offset = (base: Port, offset: Int) => base + offset;
|
|
in
|
|
add_offset(8000, 80)
|
|
```
|
|
|
|
評価結果:
|
|
|
|
```text
|
|
8080
|
|
```
|
|
|
|
## match
|
|
|
|
```dcdl
|
|
(
|
|
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
|
|
|
|
```dcdl
|
|
Base = {
|
|
feature_hoge = {
|
|
enable = Bool default true;
|
|
fuga = Int default 10;
|
|
};
|
|
};
|
|
|
|
Patched = Base // {
|
|
feature_hoge.enable = false;
|
|
};
|
|
```
|
|
|
|
`Patched` は以下に相当する。
|
|
|
|
```dcdl
|
|
{
|
|
feature_hoge = {
|
|
enable = false;
|
|
fuga = Int default 10;
|
|
};
|
|
}
|
|
```
|
|
|
|
## 循環 import
|
|
|
|
```dcdl
|
|
# main.n
|
|
{
|
|
schema = {
|
|
hoge = String;
|
|
};
|
|
|
|
result = (import ./func.n)(schema);
|
|
}
|
|
```
|
|
|
|
```dcdl
|
|
# func.n
|
|
(input: (import ./main.n).schema) =>
|
|
{
|
|
# ...
|
|
}
|
|
```
|
|
|
|
`func.n` は `main.n` を import しているが、参照しているのは `main.schema` である。
|
|
`main.schema` が `main.result` に依存していなければ、この循環 import は成立する。
|