chippyash/Validation

View on GitHub
src/Chippyash/Validation/Common/ArrayPart.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

/**
 * Chippyash/validation
 *
 * Functional validation
 *
 * Common validations
 *
 * @author    Ashley Kitson
 * @copyright Ashley Kitson, 2017, UK
 * @license GPL V3+
 */
namespace Chippyash\Validation\Common;

/**
 * Validate a specific key in an array with another validator
 */
class ArrayPart extends AbstractValidator
{
    /**@+
     * Error messages
     */
    public const ERR1 = 'value is not an array';
    public const ERR2 = 'key %s does not exist in array';
    public const ERR3 = 'key %s does not pass validation';
    /**@-*/

    /**
     * @var string
     */
    protected $keyName;
    /**
     * @var AbstractValidator
     */
    protected $keyValidator;

    /**
     * ArrayPart constructor.
     * @param string $keyName
     * @param AbstractValidator $keyValidator
     */
    public function __construct($keyName, AbstractValidator $keyValidator)
    {
        $this->keyName = $keyName;
        $this->keyValidator = $keyValidator;
    }

    /**
     * @inheritDoc
     */
    protected function validate($value)
    {
        if (!is_array($value)) {
            $this->messenger->add(self::ERR1);
            return false;
        }
        if (!array_key_exists($this->keyName, $value)) {
            $this->messenger->add(sprintf(self::ERR2, $this->keyName));
            return false;
        }

        if (!$this->keyValidator->isValid($value[$this->keyName])) {
            $this->messenger->add(sprintf(self::ERR3, $this->keyName));
            $msgs = $this->keyValidator->getMessages();
            array_walk($msgs, function ($msg): void {
                $this->messenger->add($msg);
            });
            return false;
        }

        return true;
    }
}