Add advanced Decodal example
This commit is contained in:
parent
bd3da1aeee
commit
6316939438
22
examples/advanced/README.md
Normal file
22
examples/advanced/README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# Advanced Decodal example
|
||||
|
||||
This example exercises multiple current Decodal features together:
|
||||
|
||||
- multi-file `import`
|
||||
- top-level recursive module scope
|
||||
- schema/value composition with `&`
|
||||
- deep patch with `//`
|
||||
- `default` fallback during materialization
|
||||
- constrained function parameters
|
||||
- lazy function arguments
|
||||
- `match` expressions
|
||||
- nested dot-path fields
|
||||
- arrays
|
||||
|
||||
Run it with:
|
||||
|
||||
```sh
|
||||
cargo run -q -p decodal -- examples/advanced/main.dcdl
|
||||
```
|
||||
|
||||
The entrypoint is `main.dcdl`.
|
||||
47
examples/advanced/main.dcdl
Normal file
47
examples/advanced/main.dcdl
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
let
|
||||
schema = import "./schema.dcdl";
|
||||
profiles = import "./profiles.dcdl";
|
||||
|
||||
mkService = (cfg: schema.Service) =>
|
||||
cfg // {
|
||||
summary = match cfg.env {
|
||||
"prod": "production service";
|
||||
"dev": "development service";
|
||||
_: "custom service";
|
||||
};
|
||||
};
|
||||
|
||||
devService = mkService(
|
||||
profiles.base & {
|
||||
name = "api-dev";
|
||||
port = 8443;
|
||||
}
|
||||
);
|
||||
|
||||
prodService = mkService(
|
||||
profiles.prod & {
|
||||
name = "api";
|
||||
port = 9443;
|
||||
}
|
||||
);
|
||||
|
||||
disabledService = mkService(
|
||||
profiles.disabled & {
|
||||
name = "api-disabled";
|
||||
port = 10443;
|
||||
}
|
||||
);
|
||||
in
|
||||
{
|
||||
services = [
|
||||
devService,
|
||||
prodService,
|
||||
disabledService,
|
||||
];
|
||||
|
||||
selected = match "prod" {
|
||||
"prod": prodService;
|
||||
"dev": devService;
|
||||
_: disabledService;
|
||||
};
|
||||
}
|
||||
18
examples/advanced/profiles.dcdl
Normal file
18
examples/advanced/profiles.dcdl
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Environment-specific patches.
|
||||
|
||||
base = {
|
||||
env = "dev";
|
||||
tags = ["decodal", "dev"];
|
||||
};
|
||||
|
||||
prod = base // {
|
||||
env = "prod";
|
||||
host = "api.internal";
|
||||
feature.limit = 100;
|
||||
tags = ["decodal", "prod"];
|
||||
};
|
||||
|
||||
disabled = base // {
|
||||
feature.enable = false;
|
||||
tags = ["decodal", "disabled"];
|
||||
};
|
||||
17
examples/advanced/schema.dcdl
Normal file
17
examples/advanced/schema.dcdl
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# Shared service schema.
|
||||
# Top-level fields are recursive, so SecurePort can refer to Port.
|
||||
|
||||
Port = Int & >= 1 & <= 65535;
|
||||
SecurePort = Port & > 443;
|
||||
|
||||
Service = {
|
||||
name = String;
|
||||
env = String default "dev";
|
||||
host = String default "localhost";
|
||||
port = SecurePort default 8443;
|
||||
|
||||
feature = {
|
||||
enable = Bool default true;
|
||||
limit = Int & >= 0 default 10;
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user