Rustam-Amirov/php-project-lvl2

View on GitHub
src/Formatters/Pretty.php

Summary

Maintainability
A
2 hrs
Test Coverage
B
84%
<?php

namespace Differ\GenDiff\Formatters\Pretty;

function render($diff)
{
    $result = iter($diff);
    return sprintf("{\n%s\n}", $result);
}


function iter($diff, $level = 1)
{
    $newTree = array_map(function ($v) use ($level) {
        $indent = str_repeat(' ', $level * 4 - 2);
        switch ($v['type']) {
            case 'nested':
                $children = sprintf("{\n%s\n  %s}", iter($v['children'], $level + 1), $indent);
                return bringNodeToString($indent, ' ', $v['key'], stringify($children, $indent));
            case 'changed':
                $newNode = bringNodeToString($indent, '+', $v['key'], stringify($v['newValue'], $indent));
                $oldNode = bringNodeToString($indent, '-', $v['key'], stringify($v['oldValue'], $indent));
                return $newNode . "\n" . $oldNode;
            case 'added':
                return bringNodeToString($indent, '+', $v['key'], stringify($v['newValue'], $indent));
            case 'deleted':
                return bringNodeToString($indent, '-', $v['key'], stringify($v['oldValue'], $indent));
            case 'unchanged':
                return bringNodeToString($indent, ' ', $v['key'], stringify($v['oldValue'], $indent));
            default:
                throw new \Exception("Unknown state in", 1);
        }
    }, $diff);
    return implode("\n", $newTree);
}


function bringNodeToString($indent, $type, $key, $value)
{
    return sprintf("%s%s %s: %s", $indent, $type, $key, $value);
}


function stringify($tree, $indent = '')
{
    if (is_bool($tree)) {
        return $tree ? 'true' : 'false';
    }
    if (!is_array($tree) && !is_object($tree)) {
        return (string)$tree;
    }
    if (is_array($tree)) {
        $values = array_map(function ($val) use ($indent) {
            return implode($val);
        }, $tree);
        return  "{{implode($values)},\n $indent }";
    }
    if (is_object($tree)) {
        $keys = array_keys(get_object_vars($tree));
        $values = array_map(function ($key) use ($tree, $indent) {
            return sprintf("{\n %s     %s: %s\n%s  }", $indent, $key, $tree->$key, $indent);
        }, $keys);
        return implode($values);
    }
}