From 478ccdaac7bcb6171919726317e809faa1aae8f0 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Mon, 15 Mar 2021 01:00:53 +0100
Subject: lib.haskell.substitutePkgs: init

---
 lib/haskell.nix | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 lib/haskell.nix

(limited to 'lib/haskell.nix')

diff --git a/lib/haskell.nix b/lib/haskell.nix
new file mode 100644
index 000000000..b1889caf0
--- /dev/null
+++ b/lib/haskell.nix
@@ -0,0 +1,51 @@
+{ lib }:
+
+with builtins;
+
+rec {
+
+  # Derive a file by substituting
+  # "${pkgs.foo}/bin/foo" for each {-pkg-}"foo", and
+  # "${pkgs.bar}/bin/foo" for each {-pkg:bar-}"foo".
+  # If a package doesn't exist, a warning gets printed.
+  substitutePkgs = name: { callsite ? null, pkgs, path }:
+    pkgs.writeText name (substitutePkgs' {
+      inherit pkgs;
+      sourceDescription =
+        if callsite != null then
+          "${name} in ${toString callsite}"
+        else
+          "${name} from ${toString path}";
+      text = readFile path;
+    });
+
+  substitutePkgs' = { pkgs, sourceDescription, text }:
+    let
+      f = s:
+        let
+          parse = match "(.*)([{]-pkg(:([^}]+))?-[}]\"([^\"]+)\")(.*)" s;
+          prefix = elemAt parse 0;
+          pname = if elemAt parse 3 != null then elemAt parse 3 else exename;
+          exename = elemAt parse 4;
+          suffix = elemAt parse 5;
+          pkg = pkgs.${pname} or null;
+
+          substitute =
+            if pkg != null then
+              "${pkg}/bin/${exename}"
+            else
+              trace (toString [
+                "lib.haskell.replacePkg:"
+                "warning:"
+                "while deriving ${sourceDescription}:"
+                "no substitute found for ${elemAt parse 1}"
+              ])
+              exename;
+        in
+        if parse == null then
+          s
+        else
+          f (prefix + toJSON substitute + suffix);
+    in
+    f text;
+}
-- 
cgit v1.2.3