depot/third_party/nixpkgs/pkgs/pkgs-lib/formats/php/default.nix

97 lines
2.5 KiB
Nix

{ pkgs, lib }:
{
# Format for defining configuration of some PHP services, that use "include 'config.php';" approach.
format =
{
finalVariable ? null,
}:
let
toPHP =
value:
{
"null" = "null";
"bool" = if value then "true" else "false";
"int" = toString value;
"float" = toString value;
"string" = string value;
"set" = attrs value;
"list" = list value;
}
.${builtins.typeOf value}
or (abort "should never happen: unknown value type ${builtins.typeOf value}");
# https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.single
escapeSingleQuotedString = lib.escape [
"'"
"\\"
];
string = value: "'${escapeSingleQuotedString value}'";
listContent = values: lib.concatStringsSep ", " (map toPHP values);
list = values: "[" + (listContent values) + "]";
attrsContent =
values:
lib.pipe values [
(lib.mapAttrsToList (k: v: "${toPHP k} => ${toPHP v}"))
(lib.concatStringsSep ", ")
];
attrs = set: if set ? _phpType then specialType set else "[" + attrsContent set + "]";
mixedArray =
{ list, set }: if list == [ ] then attrs set else "[${listContent list}, ${attrsContent set}]";
specialType =
{ value, _phpType }:
{
"mixed_array" = mixedArray value;
"raw" = value;
}
.${_phpType};
type =
with lib.types;
nullOr (oneOf [
bool
int
float
str
(attrsOf type)
(listOf type)
])
// {
description = "PHP value";
};
in
{
inherit type;
lib = {
mkMixedArray = list: set: {
_phpType = "mixed_array";
value = { inherit list set; };
};
mkRaw = raw: {
_phpType = "raw";
value = raw;
};
};
generate =
name: value:
pkgs.writeTextFile {
inherit name;
text =
let
# strict_types enabled here to easily debug problems when calling functions of incorrect type using `mkRaw`.
phpHeader = "<?php\ndeclare(strict_types=1);\n";
in
if finalVariable == null then
phpHeader + "return ${toPHP value};\n"
else
phpHeader + "\$${finalVariable} = ${toPHP value};\n";
};
};
}