JSValue parseSceneGlobals(JSScope& jsScope, const YAML::Node& node) { switch(node.Type()) { case YAML::NodeType::Scalar: { auto& scalar = node.Scalar(); if (scalar.compare(0, 8, "function") == 0) { return pushYamlScalarAsJsFunctionOrString(jsScope, node); } return pushYamlScalarAsJsPrimitive(jsScope, node); } case YAML::NodeType::Sequence: { auto jsArray = jsScope.newArray(); for (size_t i = 0; i < node.size(); i++) { jsArray.setValueAtIndex(i, parseSceneGlobals(jsScope, node[i])); } return jsArray; } case YAML::NodeType::Map: { auto jsObject = jsScope.newObject(); for (const auto& entry : node) { if (!entry.first.IsScalar()) { continue; // Can't put non-scalar keys in JS objects. } jsObject.setValueForProperty(entry.first.Scalar(), parseSceneGlobals(jsScope, entry.second)); } return jsObject; } default: return jsScope.newNull(); } }