Вход Регистрация
Файл: vendor/nette/schema/src/Schema/Elements/AnyOf.php
Строк: 96
<?php

/**
 * This file is part of the Nette Framework (https://nette.org)
 * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
 */

declare(strict_types=1);

namespace 
NetteSchemaElements;

use 
Nette;
use 
NetteSchemaContext;
use 
NetteSchemaHelpers;
use 
NetteSchemaSchema;


final class 
AnyOf implements Schema
{
    use 
Base;
    use 
NetteSmartObject;

    
/** @var array */
    
private $set;


    
/**
     * @param  mixed|Schema  ...$set
     */
    
public function __construct(...$set)
    {
        if (!
$set) {
            throw new 
NetteInvalidStateException('The enumeration must not be empty.');
        }

        
$this->set $set;
    }


    public function 
firstIsDefault(): self
    
{
        
$this->default $this->set[0];
        return 
$this;
    }


    public function 
nullable(): self
    
{
        
$this->set[] = null;
        return 
$this;
    }


    public function 
dynamic(): self
    
{
        
$this->set[] = new Type(NetteSchemaDynamicParameter::class);
        return 
$this;
    }


    
/********************* processing ****************d*g**/


    
public function normalize($valueContext $context)
    {
        return 
$this->doNormalize($value$context);
    }


    public function 
merge($value$base)
    {
        if (
is_array($value) && isset($value[Helpers::PREVENT_MERGING])) {
            unset(
$value[Helpers::PREVENT_MERGING]);
            return 
$value;
        }

        return 
Helpers::merge($value$base);
    }


    public function 
complete($valueContext $context)
    {
        
$expecteds $innerErrors = [];
        foreach (
$this->set as $item) {
            if (
$item instanceof Schema) {
                
$dolly = new Context;
                
$dolly->path $context->path;
                
$res $item->complete($item->normalize($value$dolly), $dolly);
                if (!
$dolly->errors) {
                    
$context->warnings array_merge($context->warnings$dolly->warnings);
                    return 
$this->doFinalize($res$context);
                }

                foreach (
$dolly->errors as $error) {
                    if (
$error->path !== $context->path || empty($error->variables['expected'])) {
                        
$innerErrors[] = $error;
                    } else {
                        
$expecteds[] = $error->variables['expected'];
                    }
                }
            } else {
                if (
$item === $value) {
                    return 
$this->doFinalize($value$context);
                }

                
$expecteds[] = NetteSchemaHelpers::formatValue($item);
            }
        }

        if (
$innerErrors) {
            
$context->errors array_merge($context->errors$innerErrors);
        } else {
            
$context->addError(
                
'The %label% %path% expects to be %expected%, %value% given.',
                
NetteSchemaMessage::TYPE_MISMATCH,
                [
                    
'value' => $value,
                    
'expected' => implode('|'array_unique($expecteds)),
                ]
            );
        }
    }


    public function 
completeDefault(Context $context)
    {
        if (
$this->required) {
            
$context->addError(
                
'The mandatory item %path% is missing.',
                
NetteSchemaMessage::MISSING_ITEM
            
);
            return 
null;
        }

        if (
$this->default instanceof Schema) {
            return 
$this->default->completeDefault($context);
        }

        return 
$this->default;
    }
}
Онлайн: 0
Реклама