Vikman88/frontend-project-lvl2

View on GitHub
src/formatters/plain.js

Summary

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

const convertToStr = (value) => {
  if (_.isObject(value)) return '[complex value]';
  return (_.isString(value)) ? `'${value}'` : value;
};

export default (obj) => {
  const iter = (object, path) => object.flatMap(({
    key, type, children, oldValue, newValue,
  }) => {
    const newPath = [...path, key];
    const buildPathStr = newPath.join('.');
    const convertedOldValue = convertToStr(oldValue);
    const convertedNewValue = convertToStr(newValue);
    switch (type) {
      case 'node':
        return iter(children, newPath);
      case 'deleted':
        return `Property '${buildPathStr}' was removed`;
      case 'added':
        return `Property '${buildPathStr}' was added with value: ${convertedNewValue}`;
      case 'changed':
        return `Property '${buildPathStr}' was updated. From ${convertedOldValue} to ${convertedNewValue}`;
      case 'unchanged':
        return null;
      default:
        throw new Error(`${type} is not supported`);
    }
  });
  return iter(obj, '').filter(Boolean).join('\n');
};