diff options
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/eval.hh | 1 | ||||
-rw-r--r-- | src/libexpr/get-drvs.cc | 43 | ||||
-rw-r--r-- | src/libexpr/get-drvs.hh | 24 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 17 |
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); } |