vbwdev/project-lvl2-s269

View on GitHub
src/renderers/plain.js

Summary

Maintainability
A
1 hr
Test Coverage
import _ from 'lodash';

const renderName = (parents, name) => `'${parents.concat(name).join('.')}'`;

const renderValue = (value, needPrefix) => {
  if (_.isObject(value)) {
    return 'complex value';
  }

  return `${needPrefix ? 'value ' : ''}${`'${value}'`}`;
};

const renderers = {
  nested: ({ key, children }, parents, process) => process(children, [...parents, key], process),

  changed: ({ key, oldValue, newValue }, parents) =>
    `Property ${renderName(parents, key)} was updated from ${renderValue(oldValue)} to ${renderValue(newValue)}`,

  added: ({ key, value }, parents) =>
    `Property ${renderName(parents, key)} was added with ${renderValue(value, true)}`,

  deleted: ({ key }, parents) => `Property ${renderName(parents, key)} was removed`,
};

const renderDiffIter = (diff, parents = []) =>
  diff.reduce((acc, item) => {
    const render = renderers[item.type];
    if (!render) {
      return acc;
    }
    return [...acc, render(item, parents, renderDiffIter)];
  }, []);

const renderDiff = (diff) => {
  const strings = renderDiffIter(diff);
  return _.flatten(strings).join('\n');
};

export default renderDiff;