diff --git a/lib.nix b/lib.nix index 1eac279..989b3e5 100644 --- a/lib.nix +++ b/lib.nix @@ -4,28 +4,56 @@ }: let _mkTinyShell = - mkShell: + mkShell: name: args@{ shellHook ? "", + dataDir ? ".data", + setDataDir ? dataDir != null, + createDataDir ? setDataDir, ... }: + + assert lib.assertMsg (builtins.isString shellHook) "${name}: `shellHook` must be a string"; + assert lib.assertMsg ( + builtins.isString dataDir || dataDir == null + ) "${name}: `dataDir` must be a string or null"; + assert lib.assertMsg (builtins.isBool setDataDir) "${name}: `setDataDir` must be a boolean"; + assert lib.assertMsg (builtins.isBool createDataDir) "${name}: `createDataDir` must be a boolean"; + + assert lib.assertMsg ( + dataDir != null -> (!lib.hasPrefix "/" dataDir) + ) "${name}: `dataDir` must be a relative path"; + assert lib.assertMsg ( + dataDir == null -> (!setDataDir && !createDataDir) + ) "${name}: `dataDir` must be not be `null` in order to set or create the data directory"; + assert lib.assertMsg ( + !createDataDir || setDataDir + ) "${name}: `setDataDir` must be set to `true` in order to create the data directory"; + mkShell ( - args + (removeAttrs args [ + "shellHook" + "dataDir" + "setDataDir" + "createDataDir" + "gitPackage" + ]) // { shellHook = '' - # start -- tinyshell hook + # start -- tinyshell hook (${name}) export PRJ_ROOT="$(${lib.getExe pkgs.git} rev-parse --show-toplevel 2>/dev/null || printf '%s\n' "$PWD")" + ${lib.optionalString setDataDir ''export PRJ_DATA_DIR="$PRJ_ROOT/${dataDir}"''} + ${lib.optionalString createDataDir ''mkdir -vp "$PRJ_DATA_DIR"''} + # end -- tinyshell hook (${name}) + ${lib.optionalString (shellHook != "") '' - export PRJ_DATA_DIR="$PRJ_ROOT/.data" - mkdir -vp "$PRJ_DATA_DIR" - # end -- tinyshell hook - - ${shellHook} + ${shellHook} + ''} ''; } ); in { - mkTinyShell = _mkTinyShell pkgs.mkShell; - mkTinyShellNoCC = _mkTinyShell pkgs.mkShellNoCC; + mkTinyShell = _mkTinyShell pkgs.mkShell "mkTinyShell"; + mkTinyShellNoCC = _mkTinyShell pkgs.mkShellNoCC "mkTinyShellNoCC"; }