diff --git a/Makefile b/Makefile index ea92eb15..132f6fe4 100644 --- a/Makefile +++ b/Makefile @@ -247,7 +247,7 @@ libjsonnet++.so.$(VERSION): $(LIB_CPP_OBJ) # std.jsonnet.h is a generated file so the first build will fail if it isn't # specified as an explicit dependency (after that, deps are known from compiler output) -core/desugarer.cpp: core/std.jsonnet.h +.makebuild/core/desugarer.cpp.o: core/std.jsonnet.h # Encode standard library for embedding in C .makebuild/stdlib/to_c_array: stdlib/to_c_array.cpp diff --git a/stdlib/std.jsonnet b/stdlib/std.jsonnet index 9a3c707e..9eee818f 100644 --- a/stdlib/std.jsonnet +++ b/stdlib/std.jsonnet @@ -299,9 +299,19 @@ limitations under the License. if !std.isFunction(func) then error ('std.flatMap first param must be function, got ' + std.type(func)) else if std.isArray(arr) then - std.flattenArrays(std.makeArray(std.length(arr), function(i) func(arr[i]))) + std.flattenArrays(std.makeArray( + std.length(arr), function(i) + local o = func(arr[i]); + if std.isArray(o) then o else + error ('std.flatMap on arrays, provided function must return an array, got ' + std.type(o)) + )) else if std.isString(arr) then - std.join('', std.makeArray(std.length(arr), function(i) func(arr[i]))) + std.join('', std.makeArray( + std.length(arr), function(i) + local o = func(arr[i]); + if std.isString(o) then o else + error ('std.flatMap on strings, provided function must return a string, got ' + std.type(o)) + )) else error ('std.flatMap second param must be array / string, got ' + std.type(arr)), join(sep, arr):: diff --git a/test_suite/error.flatMap_array_typecheck.jsonnet b/test_suite/error.flatMap_array_typecheck.jsonnet new file mode 100644 index 00000000..015dd9da --- /dev/null +++ b/test_suite/error.flatMap_array_typecheck.jsonnet @@ -0,0 +1 @@ +std.flatMap(function(x) x, ['a', 'b', 'c']) diff --git a/test_suite/error.flatMap_array_typecheck.jsonnet.golden b/test_suite/error.flatMap_array_typecheck.jsonnet.golden new file mode 100644 index 00000000..3cab803a --- /dev/null +++ b/test_suite/error.flatMap_array_typecheck.jsonnet.golden @@ -0,0 +1,11 @@ +RUNTIME ERROR: std.flatMap on arrays, provided function must return an array, got string + std.jsonnet: thunk + std.jsonnet: thunk + std.jsonnet: function + std.jsonnet: thunk + std.jsonnet: function + std.jsonnet: function + std.jsonnet: function + std.jsonnet: function + std.jsonnet:(302:7)-(307:9) function + error.flatMap_array_typecheck.jsonnet:1:1-44 diff --git a/test_suite/error.flatMap_seq_typecheck.jsonnet b/test_suite/error.flatMap_seq_typecheck.jsonnet new file mode 100644 index 00000000..54704bab --- /dev/null +++ b/test_suite/error.flatMap_seq_typecheck.jsonnet @@ -0,0 +1 @@ +std.flatMap(function(x) [x], { a: 1, b: 2, c: 3 }) diff --git a/test_suite/error.flatMap_seq_typecheck.jsonnet.golden b/test_suite/error.flatMap_seq_typecheck.jsonnet.golden new file mode 100644 index 00000000..b88f3745 --- /dev/null +++ b/test_suite/error.flatMap_seq_typecheck.jsonnet.golden @@ -0,0 +1,3 @@ +RUNTIME ERROR: std.flatMap second param must be array / string, got object + std.jsonnet: function + error.flatMap_seq_typecheck.jsonnet:1:1-51 diff --git a/test_suite/error.flatMap_string_typecheck.jsonnet b/test_suite/error.flatMap_string_typecheck.jsonnet new file mode 100644 index 00000000..0a839edd --- /dev/null +++ b/test_suite/error.flatMap_string_typecheck.jsonnet @@ -0,0 +1 @@ +std.flatMap(function(x) std.codepoint(x), 'abc') diff --git a/test_suite/error.flatMap_string_typecheck.jsonnet.golden b/test_suite/error.flatMap_string_typecheck.jsonnet.golden new file mode 100644 index 00000000..db8e757a --- /dev/null +++ b/test_suite/error.flatMap_string_typecheck.jsonnet.golden @@ -0,0 +1,4 @@ +RUNTIME ERROR: std.flatMap on strings, provided function must return a string, got number + std.jsonnet: thunk + std.jsonnet:(309:7)-(314:9) function + error.flatMap_string_typecheck.jsonnet:1:1-49