PavelDeuce/frontend-project-lvl2

View on GitHub
src/formatters/plain.js

Summary

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

import { diffsMapping } from '../utils';

const stringify = (item) => (_.isObject(item) ? '[complex value]' : `'${item}'`);

const plainRender = (ast, parents = []) =>
  ast
    .map((item) => {
      const newName = [...parents, item.name].join('.');
      const beginning = `Property '${newName}' was`;
      switch (item.state) {
        case diffsMapping.deleted:
          return `${beginning} removed`;
        case diffsMapping.added:
          return `${beginning} added with value: ${stringify(item.nextValue)}`;
        case diffsMapping.equal:
          return null;
        case diffsMapping.edited:
          return `${beginning} updated. From ${stringify(item.previousValue)} to ${stringify(
            item.nextValue
          )}`;
        case diffsMapping.nested:
          return `${plainRender(item.children, [...parents, item.name])}`;
        default:
          throw new Error(`Parse error. Unknown state: ${item.state}`);
      }
    })
    .filter((str) => str)
    .join('\n');

export default plainRender;