flakelight/builtinModules/formatter.nix
Archit Gupta 27f9ac981c Fix formatter when devShell is null
The formatter uses `devShell.packages` for its path which is not
available when devShell is null. A default value of empty list should be
used when devShell is null.
2023-12-05 02:06:23 -08:00

58 lines
1.7 KiB
Nix

# flakelight -- Framework for simplifying flake setup
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
# SPDX-License-Identifier: MIT
{ config, src, lib, flakelight, ... }:
let
inherit (lib) mkDefault mkMerge mkOption mkIf mapAttrsToList;
inherit (lib.types) lazyAttrsOf nullOr package str;
inherit (flakelight.types) optFunctionTo;
in
{
options = {
formatter = mkOption {
type = nullOr (optFunctionTo package);
default = null;
};
formatters = mkOption {
type = nullOr (optFunctionTo (lazyAttrsOf str));
default = null;
};
};
config = mkMerge [
(mkIf (config.formatter != null) {
perSystem = pkgs: {
formatter = config.formatter pkgs;
};
})
(mkIf (config.formatters != null) {
perSystem = { pkgs, lib, fd, coreutils, ... }: {
formatter = mkDefault (pkgs.writeShellScriptBin "formatter" ''
PATH=${lib.makeBinPath ((config.devShell.packages or (_: [ ])) pkgs)}
for f in "$@"; do
if [ -d "$f" ]; then
${fd}/bin/fd "$f" -Htf -x "$0" &
else
case "$(${coreutils}/bin/basename "$f")" in
${toString (mapAttrsToList
(n: v: "${n}) ${v} \"$f\" & ;;") (config.formatters pkgs))}
esac
fi
done &>/dev/null
wait
'');
};
})
(mkIf ((config.formatters != null) || (config.formatter != null)) {
checks.formatting = { lib, outputs', diffutils, ... }: ''
${lib.getExe outputs'.formatter} .
${diffutils}/bin/diff -qr ${src} . |\
sed 's/Files .* and \(.*\) differ/File \1 not formatted/g'
'';
})
];
}