liminix-fork/pkgs/pseudofile/default.nix

49 lines
1.5 KiB
Nix
Raw Permalink Normal View History

{
writeText
, lib
}:
let
inherit (lib.attrsets) mapAttrsToList;
visit = prefix: attrset:
let
qprint = msg : builtins.replaceStrings
2023-03-05 22:33:51 +01:00
["\n" "=" "\"" "$" ]
["=0A" "=3D" "=22" "=24"]
msg;
l =
mapAttrsToList
2023-04-04 22:11:28 +02:00
(filename: {
type ? "f"
, mode ? null
, target ? null
, contents ? null
, file ? null
, major ? null
, minor ? null
, uid ? 0
, gid ? 0
2023-04-04 22:11:28 +02:00
}:
let
2023-04-04 22:11:28 +02:00
mode' = if mode != null then mode else
(if type == "d" then "0755" else "0644");
pathname = "${prefix}/${filename}";
line = "${pathname} ${type} ${mode'} ${toString uid} ${toString gid}";
in
2023-04-04 22:11:28 +02:00
if type == "f" then
"${line} echo -n \"${qprint file}\" |qprint -d"
else if type == "d" then
(visit pathname contents) + "\n" + line
else if type == "c" then "${line} ${major} ${minor}"
else if type == "b" then "${line} ${major} ${minor}"
else if type == "s" then "${line} ${target}"
else if type == "l" then "${pathname} l ${target}"
else if type == "i" then "${line} f"
2023-04-04 22:11:28 +02:00
else line)
attrset;
in builtins.concatStringsSep "\n" l;
in {
write = filename : attrset : writeText filename (visit "" attrset);
dir = contents: { type = "d"; inherit contents; };
symlink = target: { type = "s"; inherit target; };
}