Use __toString when coercing sets to strings.
For example, "${{ foo = "bar"; __toString = x: x.foo; }}" evaluates
to "bar".
With this, we can delay calling functions like mkDerivation,
buildPythonPackage, etc. until we actually need a derivation, enabling
overrides and other modifications to happen by simple attribute set
update.
			
			
This commit is contained in:
		
							parent
							
								
									6298afc047
								
							
						
					
					
						commit
						14080f3e4b
					
				
					 2 changed files with 10 additions and 2 deletions
				
			
		|  | @ -261,6 +261,7 @@ EvalState::EvalState(const Strings & _searchPath) | |||
|     , sLine(symbols.create("line")) | ||||
|     , sColumn(symbols.create("column")) | ||||
|     , sFunctor(symbols.create("__functor")) | ||||
|     , sToString(symbols.create("__toString")) | ||||
|     , baseEnv(allocEnv(128)) | ||||
|     , staticBaseEnv(false, 0) | ||||
| { | ||||
|  | @ -1389,7 +1390,14 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, | |||
|     } | ||||
| 
 | ||||
|     if (v.type == tAttrs) { | ||||
|         Bindings::iterator i = v.attrs->find(sOutPath); | ||||
|         auto i = v.attrs->find(sToString); | ||||
|         if (i != v.attrs->end()) { | ||||
|             forceValue(*i->value, pos); | ||||
|             Value v1; | ||||
|             callFunction(*i->value, v, v1, pos); | ||||
|             return coerceToString(pos, v1, context, coerceMore, copyToStore); | ||||
|         } | ||||
|         i = v.attrs->find(sOutPath); | ||||
|         if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string, at %1%", pos); | ||||
|         return coerceToString(pos, *i->value, context, coerceMore, copyToStore); | ||||
|     } | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ public: | |||
| 
 | ||||
|     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, | ||||
|         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, | ||||
|         sFile, sLine, sColumn, sFunctor; | ||||
|         sFile, sLine, sColumn, sFunctor, sToString; | ||||
|     Symbol sDerivationNix; | ||||
| 
 | ||||
|     /* If set, force copying files to the Nix store even if they
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue