Вход Регистрация
Файл: vendor/laravel/prompts/src/NumberPrompt.php
Строк: 113
<?php

namespace LaravelPrompts;

use 
Closure;
use 
RuntimeException;

class 
NumberPrompt extends Prompt
{
    use 
ConcernsTypedValue;

    
/**
     * Create a new NumberPrompt instance.
     */
    
public function __construct(
        public 
string $label,
        public 
string $placeholder '',
        public 
string $default '',
        public 
bool|string $required false,
        public 
mixed $validate null,
        public 
string $hint '',
        public ?
Closure $transform null,
        public ?
int $min null,
        public ?
int $max null,
        public ?
int $step null,
    ) {
        
$this->trackTypedValue($default);

        
$this->step max(1$this->step ?? 1);
        
$this->min ??= PHP_INT_MIN;
        
$this->max ??= PHP_INT_MAX;

        
$originalValidate $this->validate;

        
$this->validate $this->wrapValidation($this->validate);

        
$this->on('key', function (string $key) {
            
match ($key) {
                
Key::UPKey::UP_ARROW => $this->increaseValue(),
                
Key::DOWNKey::DOWN_ARROW => $this->decreaseValue(),
                default => 
null,
            };
        });
    }

    protected function 
wrapValidation(mixed $validate): callable
    {
        return function (
$value) use ($validate) {
            if (
$value !== '' && ! is_numeric($value)) {
                return 
'Must be a number';
            }

            if (
is_numeric($value)) {
                if (
$value $this->min) {
                    return 
'Must be at least '.$this->min;
                }

                if (
$value $this->max) {
                    return 
'Must be less than '.$this->max;
                }
            }

            if (! 
$validate && ! isset(static::$validateUsing)) {
                return 
null;
            }

            return 
match (true) {
                
is_callable($validate) => ($validate)($value),
                isset(static::
$validateUsing) => (static::$validateUsing)($this),
                default => throw new 
RuntimeException('The validation logic is missing.'),
            };
        };
    }

    
/**
     * Increase the value of the prompt by the step.
     */
    
protected function increaseValue(): void
    
{
        if (
$this->typedValue === '') {
            
$this->typedValue = (string) ($this->min === PHP_INT_MIN $this->min);
            
$this->cursorPosition++;

            return;
        }

        if (
is_numeric($this->typedValue)) {
            
$previousValueLength mb_strlen($this->typedValue);

            
$this->typedValue = (string) min($this->max, (int) $this->typedValue $this->step);

            if (
mb_strlen($this->typedValue) > $previousValueLength) {
                
$this->cursorPosition++;
            }
        }
    }

    
/**
     * Decrease the value of the prompt by the step.
     */
    
protected function decreaseValue(): void
    
{
        if (
$this->typedValue === '') {
            
$this->typedValue = (string) ($this->max === PHP_INT_MAX $this->max);
            
$this->cursorPosition++;

            return;
        }

        if (
is_numeric($this->typedValue)) {
            
$previousValueLength mb_strlen($this->typedValue);

            
$this->typedValue = (string) max($this->min, (int) $this->typedValue $this->step);

            if (
mb_strlen($this->typedValue) < $previousValueLength) {
                
$this->cursorPosition--;
            }
        }
    }

    public function 
value(): int|string
    
{
        if (
is_numeric($this->typedValue)) {
            return (int) 
$this->typedValue;
        }

        return 
$this->typedValue;
    }

    
/**
     * Get the entered value with a virtual cursor.
     */
    
public function valueWithCursor(int $maxWidth): string
    
{
        if (
$this->value() === '') {
            return 
$this->dim($this->addCursor($this->placeholder0$maxWidth));
        }

        return 
$this->addCursor((string) $this->value(), $this->cursorPosition$maxWidth);
    }
}
Онлайн: 1
Реклама