Вход Регистрация
Файл: includes/library/aws/Aws/Api/Validator.php
Строк: 124
<?php
namespace AwsApi;

use 
Aws;

/**
 * Validates a schema against a hash of input.
 */
class Validator
{
    private 
$path = [];
    private 
$errors = [];

    
/**
     * Validates the given input against the schema.
     *
     * @param string $name  Operation name
     * @param Shape  $shape Shape to validate
     * @param array  $input Input to validate
     *
     * @throws InvalidArgumentException if the input is invalid.
     */
    
public function validate($name, Shape $shape, array $input)
    {
        
$this->dispatch($shape, $input);

        if (
$this->errors) {
            
$message = sprintf(
                
"Found %d error%s while validating the input provided for the "
                    
. "%s operation:n%s",
                
count($this->errors),
                
count($this->errors) > 1 ? 's' : '',
                
$name,
                
implode("n", $this->errors)
            );
            
$this->errors = [];
            throw new 
InvalidArgumentException($message);
        }
    }

    private function 
dispatch(Shape $shape, $value)
    {
        static 
$methods = [
            
'structure' => 'check_structure',
            
'list'      => 'check_list',
            
'map'       => 'check_map',
            
'blob'      => 'check_blob',
            
'boolean'   => 'check_boolean',
            
'integer'   => 'check_numeric',
            
'float'     => 'check_numeric',
            
'long'      => 'check_numeric',
            
'string'    => 'check_string',
            
'byte'      => 'check_string',
            
'char'      => 'check_string'
        
];

        
$type = $shape->getType();
        if (isset(
$methods[$type])) {
            
$this->{$methods[$type]}($shape, $value);
        }
    }

    private function 
check_structure(StructureShape $shape, $value)
    {
        if (!
$this->checkAssociativeArray($value)) {
            return;
        }

        if (
$shape['required']) {
            foreach (
$shape['required'] as $req) {
                if (!isset(
$value[$req])) {
                    
$this->path[] = $req;
                    
$this->addError('is missing and is a required parameter');
                    
array_pop($this->path);
                }
            }
        }

        foreach (
$value as $name => $v) {
            if (
$shape->hasMember($name)) {
                
$this->path[] = $name;
                
$this->dispatch(
                    
$shape->getMember($name),
                    isset(
$value[$name]) ? $value[$name] : null
                
);
                
array_pop($this->path);
            }
        }
    }

    private function 
check_list(ListShape $shape, $value)
    {
        if (!
is_array($value)) {
            
$this->addError('must be an array. Found ' . Awsdescribe_type($value));
            return;
        }

        
$items = $shape->getMember();
        foreach (
$value as $index => $v) {
            
$this->path[] = $index;
            
$this->dispatch($items, $v);
            
array_pop($this->path);
        }
    }

    private function 
check_map(MapShape $shape, $value)
    {
        if (!
$this->checkAssociativeArray($value)) {
            return;
        }

        
$values = $shape->getValue();
        foreach (
$value as $key => $v) {
            
$this->path[] = $key;
            
$this->dispatch($values, $v);
            
array_pop($this->path);
        }
    }

    private function 
check_blob(Shape $shape, $value)
    {
        static 
$valid = [
            
'string' => true,
            
'integer' => true,
            
'double' => true,
            
'resource' => true
        
];

        
$type = gettype($value);
        if (!isset(
$valid[$type])) {
            if (
$type != 'object' || !method_exists($value, '__toString')) {
                
$this->addError('must be an fopen resource, a '
                    
. 'GuzzleHttpStreamStreamInterface object, or something '
                    
. 'that can be cast to a string. Found ' . Awsdescribe_type($value));
            }
        }
    }

    private function 
check_numeric(Shape $shape, $value)
    {
        if (!
is_numeric($value)) {
            
$this->addError('must be numeric. Found ' . Awsdescribe_type($value));
        }
    }

    private function 
check_boolean(Shape $shape, $value)
    {
        if (!
is_bool($value)) {
            
$this->addError('must be a boolean. Found ' . Awsdescribe_type($value));
        }
    }

    private function 
check_string(Shape $shape, $value)
    {
        if (!
$this->checkCanString($value)) {
            
$this->addError('must be a string or an object that implements '
                
. '__toString(). Found ' . Awsdescribe_type($value));
        }
    }

    private function 
checkCanString($value)
    {
        static 
$valid = [
            
'string'  => true,
            
'integer' => true,
            
'double'  => true,
            
'NULL'    => true,
        ];

        
$type = gettype($value);

        return isset(
$valid[$type]) ||
            (
$type == 'object' && method_exists($valid, '__toString'));
    }

    private function 
checkAssociativeArray($value)
    {
        if (!
is_array($value) || isset($value[0])) {
            
$this->addError('must be an associative array. Found '
                
. Awsdescribe_type($value));
            return 
false;
        }

        return 
true;
    }

    private function 
addError($message)
    {
        
$this->errors[] =
            
implode('', array_map(function ($s) { return "[{$s}]"; }, $this->path))
            . 
' '
            
. $message;
    }
}
Онлайн: 2
Реклама