about summary refs log tree commit diff
path: root/users/sterni/nix/url/default.nix
{ depot, lib, ... }:

let

  inherit (depot.users.sterni.nix)
    char
    int
    string
    ;

  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);

in {
  inherit
    encode
    ;
}