summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/attrsets.nix11
-rw-r--r--lib/tests.nix10
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/attrsets.nix b/lib/attrsets.nix
index 22ecc808679..84f6cb3658b 100644
--- a/lib/attrsets.nix
+++ b/lib/attrsets.nix
@@ -23,6 +23,17 @@ rec {
       then attrByPath (tail attrPath) default e.${attr}
       else default;
 
+  /* Return if an attribute from nested attribute set exists.
+     For instance ["x" "y"] applied to some set e returns true, if e.x.y exists. False
+     is returned otherwise. */
+  hasAttrByPath = attrPath: e:
+    let attr = head attrPath;
+    in
+      if attrPath == [] then true
+      else if e ? ${attr}
+      then hasAttrByPath (tail attrPath) e.${attr}
+      else false;
+
 
   /* Return nested attribute set in which an attribute is set.  For instance
      ["x" "y"] applied with some value v returns `x.y = v;' */
diff --git a/lib/tests.nix b/lib/tests.nix
index 1fb2cbf5b53..c3b8839fda9 100644
--- a/lib/tests.nix
+++ b/lib/tests.nix
@@ -120,4 +120,14 @@ runTests {
     expected = { success = false; value = false; };
   };
 
+  testHasAttrByPathTrue = {
+    expr = hasAttrByPath ["a" "b"] { a = { b = "yey"; }; };
+    expected = true;
+  };
+
+  testHasAttrByPathFalse = {
+    expr = hasAttrByPath ["a" "b"] { a = { c = "yey"; }; };
+    expected = false;
+  };
+
 }