|
| 1 | +# Введение в опции Denix {#introduction} |
| 2 | +Опции Denix представляют собой обёртку для `lib.mkOption`. Это означает, что любую опцию Denix можно создать, используя стандартный `lib.mkOption`, и использование опций Denix является необязательным. |
| 3 | + |
| 4 | +## Зачем использовать опции Denix? {#why} |
| 5 | +Использование `lib.mkOption` может быть громоздким, и каждый раз писать что-то вроде: |
| 6 | + |
| 7 | +```nix |
| 8 | +lib.mkOption {type = lib.types.listOf lib.types.str; default = [];} |
| 9 | +``` |
| 10 | + |
| 11 | +- неудобно, особенно когда опции в вашей конфигурации используются повсеместно. Вместо этого можно написать более лаконично: |
| 12 | + |
| 13 | +```nix |
| 14 | +delib.listOfOption delib.str [] |
| 15 | +``` |
| 16 | + |
| 17 | +Таким образом, вместо создания опции через указание всех параметров, можно использовать функции Denix для более читабельного и аккуратного кода. |
| 18 | + |
| 19 | +## Принцип работы {#principle} |
| 20 | +Функции, связанные с опциями, делятся на четыре основных типа: |
| 21 | + |
| 22 | +### Создание опции с типом N |
| 23 | +- `*Option <default>` - например, `strOption "foo"`. |
| 24 | +- `*OfOption <secondType> <default>` - например, `listOfOption str ["foo" "bar"]`. |
| 25 | +- `*ToOption <secondType> <default>` - например, `lambdaToOption int (x: 123)`. |
| 26 | + |
| 27 | +### Добавление к типам опции X тип N |
| 28 | +- `allow* <option>` - например, `allowStr ...`. |
| 29 | +- `allow*Of <secondType> <option>` - например, `allowListOf str ...`. |
| 30 | +- `allow*To <secondType> <option>` - например, `allowLambdaTo int ...`. |
| 31 | + |
| 32 | +### Прямое изменение attribute set опции |
| 33 | +- `noDefault <option>` - удаляет атрибут `default` из опции. Используется редко, так как редко бывают опции без значения по умолчанию. |
| 34 | +- `readOnly <option>` - добавляет атрибут `readOnly` со значением `true`. |
| 35 | +- `apply <option> <apply>` - добавляет атрибут `apply` с переданным значением. |
| 36 | +- `description <option> <description>` - добавляет атрибут `description` с переданным значением. |
| 37 | + |
| 38 | +### Генерация конкретной опции/опций |
| 39 | +- `singleEnableOption <default> {name, ...}` - создаёт attribute set с помощью выражения `delib.setAttrByStrPath "${name}.enable" (boolOption default)`. Обычно это используется в `delib.module :: options`, с её [передаваемыми аргументами](/ru/modules/structure#passed-arguments), поэтому достаточно написать: |
| 40 | + |
| 41 | + ```nix |
| 42 | + options = delib.singleEnableOption <default>; |
| 43 | + ``` |
| 44 | + |
| 45 | +Список актуальных опций можно найти в исходном коде: [github:yunfachi/denix?path=lib/options.nix](https://github.com/yunfachi/denix/blob/master/lib/options.nix) |
| 46 | + |
| 47 | +## Примеры {#examples} |
| 48 | + |
| 49 | +| Denix | lib.mkOption | |
| 50 | +|--------------------------------------------|--------------------------------------------------------------| |
| 51 | +| `portOption 22` | `mkOption {type = types.port; default = 22;}` | |
| 52 | +| `noDefault (portOption null)` | `mkOption {type = types.port;}` | |
| 53 | +| `allowNull (portOption null)` | `mkOption {type = types.nullOr types.port; default = null;}` | |
| 54 | +| `allowStr (portOption "22")` | `mkOption {type = types.strOr types.port; default = "22";}` | |
| 55 | +| `listOfOption port []` | `mkOption {type = types.listOf types.port; default = [];}` | |
| 56 | +| `readOnly (noDefault (portOption null))` | `mkOption {type = types.port; readOnly = true;}` | |
| 57 | +| `singleEnableOption true {name = "git";}` | `git.enable = mkEnableOption "git" // {default = true;}` | |
| 58 | + |
| 59 | +> *(Обычно `{name = "git";}` указывать не требуется, так как эта функция в основном используется в `delib.module :: options`)* |
0 commit comments