Вход Регистрация
Файл: vendor/nette/schema/src/Schema/Elements/AnyOf.php
Строк: 113
<?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;

    private array 
$set;


    public function 
__construct(mixed ...$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(mixed $valueContext $context): mixed
    
{
        return 
$this->doNormalize($value$context);
    }


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

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


    public function 
complete(mixed $valueContext $context): mixed
    
{
        
$isOk $context->createChecker();
        
$value $this->findAlternative($value$context);
        
$isOk() && $value $this->doTransform($value$context);
        return 
$isOk() ? $value null;
    }


    private function 
findAlternative(mixed $valueContext $context): mixed
    
{
        
$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 
$res;
                }

                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 
$value;
                }

                
$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::TypeMismatch,
                [
                    
'value' => $value,
                    
'expected' => implode('|'array_unique($expecteds)),
                ],
            );
        }

        return 
null;
    }


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

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

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