40 lines
1.1 KiB
JavaScript
40 lines
1.1 KiB
JavaScript
|
|
/**
|
|
*
|
|
* @param {string} startingShape
|
|
* @param {{[key: string]: any}} shapeMap
|
|
*/
|
|
function visitRelatedShapeNames(startingShape, shapeMap) {
|
|
var shape = shapeMap[startingShape];
|
|
if (shape.visited) {
|
|
// exit early if the shape has been visited
|
|
return;
|
|
}
|
|
|
|
shape.visited = true;
|
|
|
|
if (['structure', 'map', 'list'].indexOf(shape.type) < 0) {
|
|
// not a complex shape, so it's a terminal shape
|
|
return;
|
|
}
|
|
|
|
if (shape.type === 'structure') {
|
|
var members = shape.members;
|
|
for (var memberName of Object.keys(members)) {
|
|
var memberShapeName = members[memberName].shape;
|
|
visitRelatedShapeNames(memberShapeName, shapeMap);
|
|
}
|
|
} else if (shape.type === 'map') {
|
|
var keyShape = shape.key.shape;
|
|
var valueShape = shape.value.shape;
|
|
visitRelatedShapeNames(keyShape, shapeMap);
|
|
visitRelatedShapeNames(valueShape, shapeMap);
|
|
} else if (shape.type === 'list') {
|
|
var memberShape = shape.member.shape;
|
|
visitRelatedShapeNames(memberShape, shapeMap);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
visitRelatedShapeNames: visitRelatedShapeNames
|
|
}; |