* listToAttrs: the list now should consist of {name, value} attribute
sets instead of {attr, value}. "name" is better than "attr" because the *combination* of the two forms the attribute.
This commit is contained in:
parent
8a9fe6c11c
commit
27a0662828
1 changed files with 29 additions and 28 deletions
|
@ -755,36 +755,37 @@ static Expr prim_hasAttr(EvalState & state, const ATermVector & args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* takes
|
/* Builds an attribute set from a list specifying (name, value)
|
||||||
* param: list of { attr="attr"; value=value }
|
pairs. To be precise, a list [{name = "name1"; value = value1;}
|
||||||
* returns an attribute set
|
... {name = "nameN"; value = valueN;}] is transformed to {name1 =
|
||||||
* */
|
value1; ... nameN = valueN;}. */
|
||||||
static Expr prim_listToAttrs(EvalState & state, const ATermVector & args)
|
static Expr prim_listToAttrs(EvalState & state, const ATermVector & args)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
ATermMap res = ATermMap();
|
ATermMap res = ATermMap();
|
||||||
|
ATermList list;
|
||||||
ATermList list;
|
list = evalList(state, args[0]);
|
||||||
list = evalList(state, args[0]);
|
for (ATermIterator i(list); i; ++i){
|
||||||
for (ATermIterator i(list); i; ++i){
|
// *i should now contain a pointer to the list item expression
|
||||||
// *i should now contain a pointer to the list item expression
|
ATermList attrs;
|
||||||
ATermList attrs;
|
Expr evaledExpr = evalExpr(state, *i);
|
||||||
Expr evaledExpr = evalExpr(state, *i);
|
if (matchAttrs(evaledExpr, attrs)){
|
||||||
if (matchAttrs(evaledExpr, attrs)){
|
Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("name")));
|
||||||
Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("attr")));
|
string attr = evalStringNoCtx(state,e);
|
||||||
string attr = evalStringNoCtx(state,e);
|
Expr r = makeSelect(evaledExpr, toATerm("value"));
|
||||||
Expr r = makeSelect(evaledExpr, toATerm("value"));
|
res.set(toATerm(attr), makeAttrRHS(r, makeNoPos()));
|
||||||
res.set(toATerm(attr), makeAttrRHS(r, makeNoPos()));
|
}
|
||||||
}
|
else
|
||||||
else {
|
throw TypeError(format("list element in `listToAttrs' is %s, expected a set { name = \"<name>\"; value = <value>; }")
|
||||||
throw EvalError(format("passed list item is a %s (value: %s). Set { attr=\"name\"; value=nix expr; } expected.") % showType(evaledExpr) % showValue(evaledExpr));
|
% showType(evaledExpr));
|
||||||
}
|
}
|
||||||
} // for
|
|
||||||
return makeAttrs(res);
|
return makeAttrs(res);
|
||||||
} catch (Error & e) {
|
|
||||||
e.addPrefix(format("in `listToAttrs':\n"));
|
} catch (Error & e) {
|
||||||
throw;
|
e.addPrefix(format("in `listToAttrs':\n"));
|
||||||
}
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Expr prim_removeAttrs(EvalState & state, const ATermVector & args)
|
static Expr prim_removeAttrs(EvalState & state, const ATermVector & args)
|
||||||
|
|
Loading…
Reference in a new issue