andreiyastrzhembski/project-lvl2-s409

View on GitHub
src/Renderers/RenderPretty.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Gendiff\Renderers\RenderPretty;

use function Funct\Collection\flattenAll;

function renderPretty($tree, $lvl = 0): string
{
    $lines = array_map(function ($node) use ($lvl) {
        [
            'key' => $key,
            'type' => $type,
            'oldValue' => $oldValue,
            'newValue' => $newValue,
            'children' => $children
        ] = $node;
        $old = is_bool($oldValue) ? var_export($oldValue, true) : $oldValue;
        $new = is_bool($newValue) ? var_export($newValue, true) : $newValue;
        switch ($type) {
            case 'nested':
                $str = insSpaces($lvl) . '    ' . $key . ': ' . renderPretty($children, $lvl + 1);
                break;
            case 'unchanged':
                $str = insSpaces($lvl) . '    ' . $key . ': ' . turnDataToStr($old, $lvl + 1);
                break;
            case 'changed':
                $str = [insSpaces($lvl) . '  - ' . $key . ': ' . turnDataToStr($old, $lvl + 1),
                insSpaces($lvl) . '  + ' . $key . ': ' . turnDataToStr($new, $lvl + 1)];
                break;
            case 'deleted':
                $str = insSpaces($lvl) . '  - ' . $key . ': ' . turnDataToStr($old, $lvl + 1);
                break;
            case 'added':
                $str = insSpaces($lvl) . '  + ' . $key . ': ' . turnDataToStr($new, $lvl + 1);
                break;
        }
        return $str;
    }, $tree);
    $text = implode(PHP_EOL, flattenAll($lines));
    return '{' . PHP_EOL . $text . PHP_EOL . insSpaces($lvl) . '}';
}

function turnDataToStr($data, $lvl = 0): string
{
    if (empty($data) || !is_array($data)) {
        return $data;
    }
    $keys = array_keys($data);
    $lines = array_reduce($keys, function ($carry, $key) use ($data, $lvl) {
        $carry[] = insSpaces($lvl + 1) . $key . ': ' . $data[$key];
        return $carry;
    }, []);
    $text = \implode(PHP_EOL, $lines) . PHP_EOL;
    return '{' . PHP_EOL . $text . insSpaces($lvl) . '}';
}

function insSpaces($lvl)
{
    return str_repeat(' ', $lvl * 4);
}