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 builtins.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: types.enum payload.values;
          binOp = a: b: { values = unique (a.values ++ b.values); };
        };
      };