SmartRW/project-lvl2-s329

View on GitHub
src/renderers/renderToTree.js

Summary

Maintainability
A
0 mins
Test Coverage
import _ from 'lodash';

const singleIndentSpaceCount = 4;

const render = (ast, treeLevel = 0) => {
  const largeIndent = ' '.repeat(treeLevel * singleIndentSpaceCount + singleIndentSpaceCount);
  const smallIndent = ' '.repeat(treeLevel * singleIndentSpaceCount + singleIndentSpaceCount / 2);
  const braceIndent = ' '.repeat(treeLevel * singleIndentSpaceCount);
  const indentBeforeObjectString = ' '.repeat((treeLevel + 1) * singleIndentSpaceCount + singleIndentSpaceCount);
  const stringify = (data) => {
    const makeStringFromObject = (obj) => {
      const objString = Object.keys(obj)
        .map(key => `${indentBeforeObjectString}${key}: ${stringify(obj[key])}`)
        .join('\n');
      return `{\n${objString}\n${largeIndent}}`;
    };
    return _.isObject(data) ? makeStringFromObject(data) : `${data}`;
  };

  const nodeCases = {
    ancestor: node => `${largeIndent}${node.key}: ${render(node.children, treeLevel + 1)}`,
    added: node => `${smallIndent}+ ${node.key}: ${stringify(node.value)}`,
    removed: node => `${smallIndent}- ${node.key}: ${stringify(node.value)}`,
    changed: node => [`${smallIndent}+ ${node.key}: ${stringify(node.value)}`,
      `${smallIndent}- ${node.key}: ${stringify(node.previousValue)}`],
    unchanged: node => `${largeIndent}${node.key}: ${stringify(node.value)}`,
  };

  const getCase = node => nodeCases[node.type];
  const buildStringFromNode = node => getCase(node)(node);
  const result = _.flatten(ast.map(buildStringFromNode)).join('\n');
  return `{\n${result}\n${braceIndent}}`;
};

export default render;