about summary refs log tree commit diff
path: root/pkgs/pkgs-lib/formats/php/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/pkgs-lib/formats/php/default.nix')
-rw-r--r--pkgs/pkgs-lib/formats/php/default.nix69
1 files changed, 69 insertions, 0 deletions
diff --git a/pkgs/pkgs-lib/formats/php/default.nix b/pkgs/pkgs-lib/formats/php/default.nix
new file mode 100644
index 0000000000000..9bd1de958d0be
--- /dev/null
+++ b/pkgs/pkgs-lib/formats/php/default.nix
@@ -0,0 +1,69 @@
+{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";
+    };
+
+  };
+}