abarmenkov/frontend-project-lvl2

View on GitHub
src/formatters/plain.js

Summary

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

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

const plain = (data) => {
  const iter = (currentValue, parent = '') => {
    const lines = currentValue
      .filter((item) => item.type !== 'unchanged')
      .map((item) => {
        switch (item.type) {
          case 'nested': {
            return iter(item.children, `${parent}${item.key}.`);
          }
          case 'added':
            return `Property '${parent}${item.key}' was added with value: ${normalizeValue(item.value)}`;
          case 'removed':
            return `Property '${parent}${item.key}' was removed`;
          case 'different':
            return `Property '${parent}${item.key}' was updated. From ${normalizeValue(item.value)} to ${normalizeValue(item.value2)}`;
          default:
            throw new Error(`Type '${item.type}' is not supported!`);
        }
      });
    return lines.join('\n');
  };
  return iter(data);
};

export default plain;