query
On this page

enum

lib.types.enum

Docs pulled from | This Revision | about 1 hour ago


A value from a set of allowed ones.


Noogle detected

Implementation

The following is the current implementation of this function.

enum =
    values:
    let
      inherit (lib.lists) unique;
      show =
        v:
        if builtins.isString v then
          ''"${v}"''
        else if builtins.isInt v then
          toString v
        else if builtins.isBool v then
          boolToString v
        else
          "<${builtins.typeOf v}>";
    in
    mkOptionType rec {
      name = "enum";
      description =
        # Length 0 or 1 enums may occur in a design pattern with type merging
        # where an "interface" module declares an empty enum and other modules
        # provide implementations, each extending the enum with their own
        # identifier.
        if values == [ ] then
          "impossible (empty enum)"
        else if builtins.length values == 1 then
          "value ${show (builtins.head values)} (singular enum)"
        else
          "one of ${concatMapStringsSep ", " show values}";
      descriptionClass = if builtins.length values < 2 then "noun" else "conjunction";
      check = flip elem values;
      merge = mergeEqualOption;
      functor = (defaultFunctor name) // {
        payload = { inherit values; };
        type = payload: lib.types.enum payload.values;
        binOp = a: b: { values = unique (a.values ++ b.values); };
      };
    };