Unverified Commit b4cdc151 authored by Valentin Gagarin's avatar Valentin Gagarin Committed by GitHub
Browse files

Merge pull request #286544 from hercules-ci/doRename-doc

lib.modules.doRename: Add doc comments
parents b8cc45f3 fe362520
Loading
Loading
Loading
Loading
+72 −1
Original line number Diff line number Diff line
@@ -1256,7 +1256,78 @@ let
      (opt.highestPrio or defaultOverridePriority)
      (f opt.value);

  doRename = { from, to, visible, warn, use, withPriority ? true, condition ? true }:
  /*
    Return a module that help declares an option that has been renamed.
    When a value is defined for the old option, it is forwarded to the `to` option.
   */
  doRename = {
    # List of strings representing the attribute path of the old option.
    from,
    # List of strings representing the attribute path of the new option.
    to,
    # Boolean, whether the old option is to be included in documentation.
    visible,
    # Whether to warn when a value is defined for the old option.
    # NOTE: This requires the NixOS assertions module to be imported, so
    #        - this generally does not work in submodules
    #        - this may or may not work outside NixOS
    warn,
    # A function that is applied to the option value, to form the value
    # of the old `from` option.
    #
    # For example, the identity function can be passed, to return the option value unchanged.
    # ```nix
    # use = x: x;
    # ```
    #
    # To add a warning, you can pass the partially applied `warn` function.
    # ```nix
    # use = lib.warn "Obsolete option `${opt.old}' is used. Use `${opt.to}' instead.";
    # ```
    use,
    # Legacy option, enabled by default: whether to preserve the priority of definitions in `old`.
    withPriority ? true,
    # A boolean that defines the `mkIf` condition for `to`.
    # If the condition evaluates to `true`, and the `to` path points into an
    # `attrsOf (submodule ...)`, then `doRename` would cause an empty module to
    # be created, even if the `from` option is undefined.
    # By setting this to an expression that may return `false`, you can inhibit
    # this undesired behavior.
    #
    # Example:
    #
    # ```nix
    # { config, lib, ... }:
    # let
    #   inherit (lib) mkOption mkEnableOption types doRename;
    # in
    # {
    #   options = {
    #
    #     # Old service
    #     services.foo.enable = mkEnableOption "foo";
    #
    #     # New multi-instance service
    #     services.foos = mkOption {
    #       type = types.attrsOf (types.submodule …);
    #     };
    #   };
    #   imports = [
    #     (doRename {
    #       from = [ "services" "foo" "bar" ];
    #       to = [ "services" "foos" "" "bar" ];
    #       visible = true;
    #       warn = false;
    #       use = x: x;
    #       withPriority = true;
    #       # Only define services.foos."" if needed. (It's not just about `bar`)
    #       condition = config.services.foo.enable;
    #     })
    #   ];
    # }
    # ```
    condition ? true
  }:
    { config, options, ... }:
    let
      fromOpt = getAttrFromPath from options;