visit-related-shape-names.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /**
  2. *
  3. * @param {string} startingShape
  4. * @param {{[key: string]: any}} shapeMap
  5. */
  6. function visitRelatedShapeNames(startingShape, shapeMap) {
  7. var shape = shapeMap[startingShape];
  8. if (shape.visited) {
  9. // exit early if the shape has been visited
  10. return;
  11. }
  12. shape.visited = true;
  13. if (['structure', 'map', 'list'].indexOf(shape.type) < 0) {
  14. // not a complex shape, so it's a terminal shape
  15. return;
  16. }
  17. if (shape.type === 'structure') {
  18. var members = shape.members;
  19. for (var memberName of Object.keys(members)) {
  20. var memberShapeName = members[memberName].shape;
  21. visitRelatedShapeNames(memberShapeName, shapeMap);
  22. }
  23. } else if (shape.type === 'map') {
  24. var keyShape = shape.key.shape;
  25. var valueShape = shape.value.shape;
  26. visitRelatedShapeNames(keyShape, shapeMap);
  27. visitRelatedShapeNames(valueShape, shapeMap);
  28. } else if (shape.type === 'list') {
  29. var memberShape = shape.member.shape;
  30. visitRelatedShapeNames(memberShape, shapeMap);
  31. }
  32. }
  33. module.exports = {
  34. visitRelatedShapeNames: visitRelatedShapeNames
  35. };