kix/apiranha

View on GitHub
src/Exception/InvalidParameterException.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace Kix\Apiranha\Exception;

/**
 * Class InvalidParameterException
 */
class InvalidParameterException extends InvalidArgumentException
{
    public static $scalarTypes = ['int', 'integer', 'float', 'long', 'bool', 'boolean', 'string', 'array'];

    /**
     * Thrown when a parameter passed to a <code>ParameterDefinition</code> does not comply with the definition's 
     * parameter specification.
     * 
     * @param string|array $expected A list of class names or scalar types
     * @param mixed $actual Actual value passed
     * @return InvalidParameterException
     */
    public static function forTypeMismatch($expected, $actual)
    {
        $expectedClasses = [];
        $expectedTypes = [];
        
        if (is_array($expected)) {
            foreach ($expected as $item) {
                if (in_array($item, self::$scalarTypes, true)) {
                    $expectedTypes []= $item;
                } elseif (class_exists($item)) {
                    $expectedClasses []= $item;
                }
            }
        } else {
            if (in_array($expected, self::$scalarTypes, true)) {
                $expectedTypes []= $expected;
            } elseif (class_exists($expected)) {
                $expectedClasses []= $expected;
            }
        }
        
        $classOrType = [];

        $expectedClassCount = count($expectedClasses);
        if ($expectedClassCount > 0) {
            $title = ($expectedClassCount > 1) ? 'classes' : 'class';
            $classOrType []= $title.' '.implode(', ', $expectedClasses);
        }

        $expectedTypeCount = count($expectedTypes);
        if ($expectedTypeCount > 0) {
            $title = ($expectedTypeCount > 1) ? 'types' : 'type';
            $classOrType []= $title.' '.implode(', ', $expectedTypes);
        }

        $actualType = is_object($actual) ? get_class($actual) : gettype($actual);
        
        return new self(sprintf(
            'Expected %s of %s; got %s instead',
            (count($expectedClasses) > 0) ? 'an instance' : 'an argument',
            implode(' or ', $classOrType) ,
            $actualType
        ));
    }
}