about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.hh1
-rw-r--r--src/libexpr/get-drvs.cc43
-rw-r--r--src/libexpr/get-drvs.hh24
-rw-r--r--src/libexpr/primops.cc17
4 files changed, 62 insertions, 23 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 602f63fdedaf..cbdcb274e062 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -56,6 +56,7 @@ Expr evalFile(EvalState & state, const Path & path);
 string evalString(EvalState & state, Expr e);
 Path evalPath(EvalState & state, Expr e);
 ATermList evalList(EvalState & state, Expr e);
+ATerm coerceToString(Expr e);
 
 /* Print statistics. */
 void printEvalStats(EvalState & state);
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index 63e68eb6f489..ff38ff794812 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -2,6 +2,49 @@
 #include "nixexpr-ast.hh"
 
 
+string DrvInfo::queryDrvPath(EvalState & state) const
+{
+    if (drvPath == "") {
+        Expr a = attrs.get("drvPath");
+        (string &) drvPath = a ? evalPath(state, a) : "";
+    }
+    return drvPath;
+}
+
+
+string DrvInfo::queryOutPath(EvalState & state) const
+{
+    if (outPath == "") {
+        Expr a = attrs.get("outPath");
+        if (!a) throw Error("output path missing");
+        (string &) outPath = evalPath(state, a);
+    }
+    return outPath;
+}
+
+
+MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const
+{
+    MetaInfo meta;
+    
+    Expr a = attrs.get("meta");
+    if (!a) return meta; /* fine, empty meta information */
+
+    ATermMap attrs2;
+    queryAllAttrs(evalExpr(state, a), attrs2);
+
+    for (ATermIterator i(attrs2.keys()); i; ++i) {
+        ATerm s = coerceToString(evalExpr(state, attrs2.get(*i)));
+        if (s)
+            meta[aterm2String(*i)] = aterm2String(s);
+        /* For future compatibility, ignore attribute values that are
+           not strings. */
+    }
+
+    return meta;
+}
+
+
 typedef set<Expr> Exprs;
 
 
diff --git a/src/libexpr/get-drvs.hh b/src/libexpr/get-drvs.hh
index 5b1c0e6d4cc1..e692a5c660e1 100644
--- a/src/libexpr/get-drvs.hh
+++ b/src/libexpr/get-drvs.hh
@@ -7,6 +7,9 @@
 #include "eval.hh"
 
 
+typedef map<string, string> MetaInfo;
+
+
 struct DrvInfo
 {
 private:
@@ -19,24 +22,9 @@ public:
 
     ATermMap attrs;
 
-    string queryDrvPath(EvalState & state) const
-    {
-        if (drvPath == "") {
-            Expr a = attrs.get("drvPath");
-            (string &) drvPath = a ? evalPath(state, a) : "";
-        }
-        return drvPath;
-    }
-    
-    string queryOutPath(EvalState & state) const
-    {
-        if (outPath == "") {
-            Expr a = attrs.get("outPath");
-            if (!a) throw Error("output path missing");
-            (string &) outPath = evalPath(state, a);
-        }
-        return outPath;
-    }
+    string queryDrvPath(EvalState & state) const;
+    string queryOutPath(EvalState & state) const;
+    MetaInfo queryMetaInfo(EvalState & state) const;
 
     void setDrvPath(const string & s)
     {
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 77721a5a8d87..c5560be971df 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -390,14 +390,21 @@ static Expr primDirOf(EvalState & state, const ATermVector & args)
 }
 
 
+ATerm coerceToString(Expr e)
+{
+    ATerm s;
+    if (matchStr(e, s) || matchPath(e, s) || matchUri(e, s))
+        return s;
+    return 0;
+}
+
+
 /* Convert the argument (which can be a path or a uri) to a string. */
 static Expr primToString(EvalState & state, const ATermVector & args)
 {
-    Expr arg = evalExpr(state, args[0]);
-    ATerm s;
-    if (matchStr(arg, s) || matchPath(arg, s) || matchUri(arg, s))
-        return makeStr(s);
-    throw Error("cannot coerce value to string");
+    ATerm s = coerceToString(evalExpr(state, args[0]));
+    if (!s) throw Error("cannot coerce value to string");
+    return makeStr(s);
 }