* Primop `toPath' to convert a string to a path.

* Primop `pathExists' to check for path existence.
This commit is contained in:
Eelco Dolstra 2006-09-24 18:23:32 +00:00
parent e47e0c2dbe
commit 0e705391db
3 changed files with 30 additions and 7 deletions

View file

@ -49,13 +49,6 @@ static Expr primImport(EvalState & state, const ATermVector & args)
if (matchPath(arg, arg2)) if (matchPath(arg, arg2))
path = aterm2String(arg2); path = aterm2String(arg2);
else if (matchStr(arg, arg2)) {
path = aterm2String(arg2);
if (path == "" || path[0] != '/')
throw EvalError("`import' requires an absolute path name");
path = canonPath(path);
}
else if (matchAttrs(arg, es)) { else if (matchAttrs(arg, es)) {
Expr a = queryAttr(arg, "type"); Expr a = queryAttr(arg, "type");
@ -80,6 +73,17 @@ static Expr primImport(EvalState & state, const ATermVector & args)
} }
static Expr primPathExists(EvalState & state, const ATermVector & args)
{
Expr arg = evalExpr(state, args[0]), arg2;
if (!matchPath(arg, arg2))
throw TypeError("`pathExists' requires a path as its argument");
return makeBool(pathExists(aterm2String(arg2)));
}
static void flattenList(EvalState & state, Expr e, ATermList & result) static void flattenList(EvalState & state, Expr e, ATermList & result)
{ {
ATermList es; ATermList es;
@ -476,6 +480,19 @@ static Expr primToString(EvalState & state, const ATermVector & args)
} }
/* Convert the argument to a path. */
static Expr primToPath(EvalState & state, const ATermVector & args)
{
Expr e = evalExpr(state, args[0]);
ATerm t = coerceToString(e);
if (!t) throw TypeError(format("cannot coerce %1% to a path in `toPath'") % showType(e));
Path path = aterm2String(t);
if (path == "" || path[0] != '/')
throw EvalError("string doesn't represent an absolute path in `toPath'");
return makePath(toATerm(canonPath(path)));
}
/* Convert the argument (which can be any Nix expression) to an XML /* Convert the argument (which can be any Nix expression) to an XML
representation returned in a string. Not all Nix expressions can representation returned in a string. Not all Nix expressions can
be sensibly or completely represented (e.g., functions). */ be sensibly or completely represented (e.g., functions). */
@ -809,11 +826,13 @@ void EvalState::addPrimOps()
addPrimOp("__currentTime", 0, primCurrentTime); addPrimOp("__currentTime", 0, primCurrentTime);
addPrimOp("import", 1, primImport); addPrimOp("import", 1, primImport);
addPrimOp("__pathExists", 1, primPathExists);
addPrimOp("derivation!", 1, primDerivationStrict); addPrimOp("derivation!", 1, primDerivationStrict);
addPrimOp("derivation", 1, primDerivationLazy); addPrimOp("derivation", 1, primDerivationLazy);
addPrimOp("baseNameOf", 1, primBaseNameOf); addPrimOp("baseNameOf", 1, primBaseNameOf);
addPrimOp("dirOf", 1, primDirOf); addPrimOp("dirOf", 1, primDirOf);
addPrimOp("toString", 1, primToString); addPrimOp("toString", 1, primToString);
addPrimOp("__toPath", 1, primToPath);
addPrimOp("__toXML", 1, primToXML); addPrimOp("__toXML", 1, primToXML);
addPrimOp("__toFile", 1, primToFile); addPrimOp("__toFile", 1, primToFile);
addPrimOp("isNull", 1, primIsNull); addPrimOp("isNull", 1, primIsNull);

View file

@ -0,0 +1 @@
Bool(True)

View file

@ -0,0 +1,3 @@
builtins.pathExists (builtins.toPath ./lib.nix)
&& builtins.pathExists ./lib.nix
&& !builtins.pathExists ./bla.nix