From a9f44721e51a189349910a5cf95e1071b01632a1 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 3 Mar 2023 23:45:12 +0300 Subject: refactor(tvix/eval): move `__toString` calling to a helper function It turns out that this is used not just in coerceToString, but also in toJSON. Change-Id: I1c324b115a0b8bb6d83446d5bf70453c9b90685e Reviewed-on: https://cl.tvl.fyi/c/depot/+/8203 Tested-by: BuildkiteCI Reviewed-by: raitobezarius --- tvix/eval/src/value/mod.rs | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) (limited to 'tvix/eval/src/value/mod.rs') diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index 4acdd135f4bb..4e93b36d55d3 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -265,32 +265,16 @@ impl Value { // set itself or an `outPath` attribute which should be a string. // `__toString` is preferred. (Value::Attrs(attrs), kind) => { - match (attrs.select("__toString"), attrs.select("outPath")) { - (None, None) => Err(ErrorKind::NotCoercibleToString { from: "set", kind }), - - (Some(f), _) => { - let callable = generators::request_force(&co, f.clone()).await; - - // Leave the attribute set on the stack as an argument - // to the function call. - generators::request_stack_push(&co, Value::Attrs(attrs)).await; - - // Call the callable ... - let result = generators::request_call(&co, callable).await; - - // Recurse on the result, as attribute set coercion - // actually works recursively, e.g. you can even return - // /another/ set with a __toString attr. - let s = generators::request_string_coerce(&co, result, kind).await; - Ok(Value::String(s)) - } + if let Some(s) = attrs.try_to_string(&co, kind).await { + return Ok(Value::String(s)); + } - // Similarly to `__toString` we also coerce recursively for `outPath` - (None, Some(s)) => { - let s = generators::request_string_coerce(&co, s.clone(), kind).await; - Ok(Value::String(s)) - } + if let Some(out_path) = attrs.select("outPath") { + let s = generators::request_string_coerce(&co, out_path.clone(), kind).await; + return Ok(Value::String(s)); } + + Err(ErrorKind::NotCoercibleToString { from: "set", kind }) } // strong coercions -- cgit 1.4.1