| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Config\Definition\Builder;use Symfony\Component\Config\Definition\Exception\UnsetKeyException;/** * This class builds an if expression. * * @author Johannes M. Schmitt <schmittjoh@gmail.com> * @author Christophe Coevoet <stof@notk.org> */class ExprBuilder{    protected $node;    public $ifPart;    public $thenPart;    public function __construct(NodeDefinition $node)    {        $this->node = $node;    }    /**     * Marks the expression as being always used.     *     * @return $this     */    public function always(?\Closure $then = null)    {        $this->ifPart = function () { return true; };        if (null !== $then) {            $this->thenPart = $then;        }        return $this;    }    /**     * Sets a closure to use as tests.     *     * The default one tests if the value is true.     *     * @return $this     */    public function ifTrue(?\Closure $closure = null)    {        if (null === $closure) {            $closure = function ($v) { return true === $v; };        }        $this->ifPart = $closure;        return $this;    }    /**     * Tests if the value is a string.     *     * @return $this     */    public function ifString()    {        $this->ifPart = function ($v) { return \is_string($v); };        return $this;    }    /**     * Tests if the value is null.     *     * @return $this     */    public function ifNull()    {        $this->ifPart = function ($v) { return null === $v; };        return $this;    }    /**     * Tests if the value is empty.     *     * @return $this     */    public function ifEmpty()    {        $this->ifPart = function ($v) { return empty($v); };        return $this;    }    /**     * Tests if the value is an array.     *     * @return $this     */    public function ifArray()    {        $this->ifPart = function ($v) { return \is_array($v); };        return $this;    }    /**     * Tests if the value is in an array.     *     * @return $this     */    public function ifInArray(array $array)    {        $this->ifPart = function ($v) use ($array) { return \in_array($v, $array, true); };        return $this;    }    /**     * Tests if the value is not in an array.     *     * @return $this     */    public function ifNotInArray(array $array)    {        $this->ifPart = function ($v) use ($array) { return !\in_array($v, $array, true); };        return $this;    }    /**     * Transforms variables of any type into an array.     *     * @return $this     */    public function castToArray()    {        $this->ifPart = function ($v) { return !\is_array($v); };        $this->thenPart = function ($v) { return [$v]; };        return $this;    }    /**     * Sets the closure to run if the test pass.     *     * @return $this     */    public function then(\Closure $closure)    {        $this->thenPart = $closure;        return $this;    }    /**     * Sets a closure returning an empty array.     *     * @return $this     */    public function thenEmptyArray()    {        $this->thenPart = function () { return []; };        return $this;    }    /**     * Sets a closure marking the value as invalid at processing time.     *     * if you want to add the value of the node in your message just use a %s placeholder.     *     * @return $this     *     * @throws \InvalidArgumentException     */    public function thenInvalid(string $message)    {        $this->thenPart = function ($v) use ($message) { throw new \InvalidArgumentException(sprintf($message, json_encode($v))); };        return $this;    }    /**     * Sets a closure unsetting this key of the array at processing time.     *     * @return $this     *     * @throws UnsetKeyException     */    public function thenUnset()    {        $this->thenPart = function () { throw new UnsetKeyException('Unsetting key.'); };        return $this;    }    /**     * Returns the related node.     *     * @return NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition     *     * @throws \RuntimeException     */    public function end()    {        if (null === $this->ifPart) {            throw new \RuntimeException('You must specify an if part.');        }        if (null === $this->thenPart) {            throw new \RuntimeException('You must specify a then part.');        }        return $this->node;    }    /**     * Builds the expressions.     *     * @param ExprBuilder[] $expressions An array of ExprBuilder instances to build     *     * @return array     */    public static function buildExpressions(array $expressions)    {        foreach ($expressions as $k => $expr) {            if ($expr instanceof self) {                $if = $expr->ifPart;                $then = $expr->thenPart;                $expressions[$k] = function ($v) use ($if, $then) {                    return $if($v) ? $then($v) : $v;                };            }        }        return $expressions;    }}
 |