aa122cbae7
This CL can be used to compare the style of nixpkgs-fmt against other formatters (nixpkgs, alejandra). Change-Id: I87c6abff6bcb546b02ead15ad0405f81e01b6d9e Reviewed-on: https://cl.tvl.fyi/c/depot/+/4397 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: wpcarro <wpcarro@gmail.com> Reviewed-by: Profpatsch <mail@profpatsch.de> Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: tazjin <tazjin@tvl.su> Reviewed-by: cynthia <cynthia@tvl.fyi> Reviewed-by: edef <edef@edef.eu> Reviewed-by: eta <tvl@eta.st> Reviewed-by: grfn <grfn@gws.fyi>
100 lines
1.6 KiB
Nix
100 lines
1.6 KiB
Nix
{ depot, lib, ... }:
|
|
|
|
let
|
|
|
|
inherit (depot.users.sterni.nix)
|
|
char
|
|
int
|
|
string
|
|
flow
|
|
;
|
|
|
|
reserved = c: builtins.elem c [
|
|
"!"
|
|
"#"
|
|
"$"
|
|
"&"
|
|
"'"
|
|
"("
|
|
")"
|
|
"*"
|
|
"+"
|
|
","
|
|
"/"
|
|
":"
|
|
";"
|
|
"="
|
|
"?"
|
|
"@"
|
|
"["
|
|
"]"
|
|
];
|
|
|
|
unreserved = c: char.asciiAlphaNum c
|
|
|| builtins.elem c [ "-" "_" "." "~" ];
|
|
|
|
percentEncode = c:
|
|
if unreserved c
|
|
then c
|
|
else "%" + (string.fit
|
|
{
|
|
width = 2;
|
|
char = "0";
|
|
side = "left";
|
|
}
|
|
(int.toHex (char.ord c)));
|
|
|
|
encode = { leaveReserved ? false }: s:
|
|
let
|
|
chars = lib.stringToCharacters s;
|
|
tr = c:
|
|
if leaveReserved && reserved c
|
|
then c
|
|
else percentEncode c;
|
|
in
|
|
lib.concatStrings (builtins.map tr chars);
|
|
|
|
decode = s:
|
|
let
|
|
tokens = builtins.split "%" s;
|
|
decodeStep =
|
|
{ result ? ""
|
|
, inPercent ? false
|
|
}: s:
|
|
flow.cond [
|
|
[
|
|
(builtins.isList s)
|
|
{
|
|
inherit result;
|
|
inPercent = true;
|
|
}
|
|
]
|
|
[
|
|
inPercent
|
|
{
|
|
inPercent = false;
|
|
# first two characters came after an %
|
|
# the rest is the string until the next %
|
|
result = result
|
|
+ char.chr (int.fromHex (string.take 2 s))
|
|
+ (string.drop 2 s);
|
|
}
|
|
]
|
|
[
|
|
(!inPercent)
|
|
{
|
|
result = result + s;
|
|
}
|
|
]
|
|
];
|
|
|
|
in
|
|
(builtins.foldl' decodeStep { } tokens).result;
|
|
|
|
in
|
|
{
|
|
inherit
|
|
encode
|
|
decode
|
|
;
|
|
}
|