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

use 
Nette;
use 
NetteSchemaElementsAnyOf;
use 
NetteSchemaElementsStructure;
use 
NetteSchemaElementsType;


/**
 * Schema generator.
 *
 * @method static Type scalar($default = null)
 * @method static Type string($default = null)
 * @method static Type int($default = null)
 * @method static Type float($default = null)
 * @method static Type bool($default = null)
 * @method static Type null()
 * @method static Type list($default = [])
 * @method static Type mixed($default = null)
 * @method static Type email($default = null)
 * @method static Type unicode($default = null)
 */
final class Expect
{
    public static function 
__callStatic(string $name, array $args): Type
    
{
        
$type = new Type($name);
        if (
$args) {
            
$type->default($args[0]);
        }

        return 
$type;
    }


    public static function 
type(string $type): Type
    
{
        return new 
Type($type);
    }


    public static function 
anyOf(mixed ...$set): AnyOf
    
{
        return new 
AnyOf(...$set);
    }


    
/**
     * @param  Schema[]  $shape
     */
    
public static function structure(array $shape): Structure
    
{
        return new 
Structure($shape);
    }


    public static function 
from(object $object, array $items = []): Structure
    
{
        
$ro = new ReflectionObject($object);
        
$props $ro->hasMethod('__construct')
            ? 
$ro->getMethod('__construct')->getParameters()
            : 
$ro->getProperties();

        foreach (
$props as $prop) {
            
$item = &$items[$prop->getName()];
            if (!
$item) {
                
$type Helpers::getPropertyType($prop) ?? 'mixed';
                
$item = new Type($type);
                if (
$prop instanceof ReflectionProperty $prop->isInitialized($object) : $prop->isOptional()) {
                    
$def = ($prop instanceof ReflectionProperty $prop->getValue($object) : $prop->getDefaultValue());
                    if (
is_object($def)) {
                        
$item = static::from($def);
                    } elseif (
$def === null && !NetteUtilsValidators::is(null$type)) {
                        
$item->required();
                    } else {
                        
$item->default($def);
                    }
                } else {
                    
$item->required();
                }
            }
        }

        return (new 
Structure($items))->castTo($ro->getName());
    }


    
/**
     * @param  mixed[]  $shape
     */
    
public static function array(?array $shape = []): Structure|Type
    
{
        return 
NetteUtilsArrays::first($shape ?? []) instanceof Schema
            
? (new Structure($shape))->castTo('array')
            : (new 
Type('array'))->default($shape);
    }


    public static function 
arrayOf(string|Schema $valueTypestring|Schema|null $keyType null): Type
    
{
        return (new 
Type('array'))->items($valueType$keyType);
    }


    public static function 
listOf(string|Schema $type): Type
    
{
        return (new 
Type('list'))->items($type);
    }
}
Онлайн: 0
Реклама