{"record":{"id":"fb7804954a167ee3","repo":"apple/pkl","slug":"cannotrendernonscalarmap","errorCode":"cannotRenderNonScalarMap","errorMessage":"cannotRenderNonScalarMap","messagePattern":"cannotRenderNonScalarMap","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/stdlib/AbstractRenderer.java","lineNumber":445,"sourceCode":"  @Override\n  public void visitFunction(VmFunction value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  protected void cannotRenderNonStringKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonStringMap\" : \"cannotRenderObjectWithNonStringKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n\n  protected void cannotRenderNonScalarKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonScalarMap\" : \"cannotRenderObjectWithNonScalarKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n}\n","sourceCodeStart":427,"sourceCodeEnd":452,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/stdlib/AbstractRenderer.java#L427-L452","documentation":"Renderer map keys must be scalar values. cannotRenderNonScalarKey throws cannotRenderNonScalarMap when the enclosing value is a VmMap and a key is a non-scalar (e.g. an object, listing, or collection). Target output formats cannot represent composite keys, so rendering aborts with the enclosing Map and offending Key attached.","triggerScenarios":"Rendering a Map that contains a key which is itself a non-scalar value such as a Dynamic object, Listing, Map, or other composite value.","commonSituations":"Using objects or collections as Map keys by accident; building indexes keyed by parsed structures; nested data conversion that placed a collection where a scalar key was expected.","solutions":["Replace the composite key with a scalar: a String derived from it (e.g. its `toString()` or a stable id field).","Use an identifying property of the object (e.g. `obj.name`) as the key instead of the object itself.","If association of composite data is needed, store it as the value or in a Listing of pairs.","Log/inspect the reported `Key` program value to find where the composite key originates."],"exampleFix":"// before\nMapping { [List(1, 2)] = \"pair\" }\n\n// after\nMapping { [\"1-2\"] = \"pair\" } // stringified scalar key","handlingStrategy":"validation","validationCode":"// ensure keys are scalars before rendering\nfunction hasScalarKeys(m: Map) = m.keys.every((k) -> k is String || k is Number || k is Boolean)","typeGuard":null,"tryCatchPattern":"try { render(mapValue) } catch (e) { if (e.message.contains('cannotRenderNonScalarMap')) render(keyToId(mapValue)) else throw e }","preventionTips":["Never use objects/collections as Map keys","Derive scalar keys from an id/name property of composite values","Inspect the Key program value in the error to locate the offending key source"],"tags":["pkl","renderer","serialization","map-keys"],"backgroundTag":"invalid-argument-value","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}