blob: 4a401873a1f2b810bdb606065d6027c339a3f0ca (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
{ 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
;
}
|