Skip to content

Commit

Permalink
Implement ConstConstraint
Browse files Browse the repository at this point in the history
  • Loading branch information
martin-helmich committed Apr 17, 2018
1 parent 9db6594 commit 9a3d12a
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/JsonSchema/ConstraintError.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class ConstraintError extends Enum
const DISALLOW = 'disallow';
const DIVISIBLE_BY = 'divisibleBy';
const ENUM = 'enum';
const CONSTANT = 'const';
const EXCLUSIVE_MINIMUM = 'exclusiveMinimum';
const EXCLUSIVE_MAXIMUM = 'exclusiveMaximum';
const FORMAT_COLOR = 'colorFormat';
Expand Down Expand Up @@ -63,6 +64,7 @@ public function getMessage()
self::DISALLOW => 'Disallowed value was matched',
self::DIVISIBLE_BY => 'Is not divisible by %d',
self::ENUM => 'Does not have a value in the enumeration %s',
self::CONSTANT => 'Does not have a value equal to %s',
self::EXCLUSIVE_MINIMUM => 'Must have a minimum value greater than %d',
self::EXCLUSIVE_MAXIMUM => 'Must have a maximum value less than %d',
self::FORMAT_COLOR => 'Invalid color',
Expand Down
54 changes: 54 additions & 0 deletions src/JsonSchema/Constraints/ConstConstraint.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

/*
* This file is part of the JsonSchema package.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace JsonSchema\Constraints;

use JsonSchema\ConstraintError;
use JsonSchema\Entity\JsonPointer;

/**
* The ConstConstraint Constraints, validates an element against a constant value
*
* @author Martin Helmich <martin@helmich.me>
*/
class ConstConstraint extends Constraint
{
/**
* {@inheritdoc}
*/
public function check(&$element, $schema = null, JsonPointer $path = null, $i = null)
{
// Only validate enum if the attribute exists
if ($element instanceof UndefinedConstraint && (!isset($schema->required) || !$schema->required)) {
return;
}
$const = $schema->const;

$type = gettype($element);
$constType = gettype($const);

if ($this->factory->getConfig(self::CHECK_MODE_TYPE_CAST) && $type == 'array' && $constType == 'object') {
if ((object) $element == $const) {
return;
}
}

if ($type === gettype($const)) {
if ($type == 'object') {
if ($element == $const) {
return;
}
} elseif ($element === $const) {
return;
}
}

$this->addError(ConstraintError::CONSTANT(), $path, array('const' => $schema->const));
}
}
16 changes: 16 additions & 0 deletions src/JsonSchema/Constraints/Constraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,22 @@ protected function checkEnum($value, $schema = null, JsonPointer $path = null, $
$this->addErrors($validator->getErrors());
}

/**
* Checks a const element
*
* @param mixed $value
* @param mixed $schema
* @param JsonPointer|null $path
* @param mixed $i
*/
protected function checkConst($value, $schema = null, JsonPointer $path = null, $i = null)
{
$validator = $this->factory->createInstanceFor('const');
$validator->check($value, $schema, $path, $i);

$this->addErrors($validator->getErrors());
}

/**
* Checks format of an element
*
Expand Down
1 change: 1 addition & 0 deletions src/JsonSchema/Constraints/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class Factory
'string' => 'JsonSchema\Constraints\StringConstraint',
'number' => 'JsonSchema\Constraints\NumberConstraint',
'enum' => 'JsonSchema\Constraints\EnumConstraint',
'const' => 'JsonSchema\Constraints\ConstConstraint',
'format' => 'JsonSchema\Constraints\FormatConstraint',
'schema' => 'JsonSchema\Constraints\SchemaConstraint',
'validator' => 'JsonSchema\Validator'
Expand Down
5 changes: 5 additions & 0 deletions src/JsonSchema/Constraints/UndefinedConstraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ public function validateTypes(&$value, $schema = null, JsonPointer $path, $i = n
if (isset($schema->enum)) {
$this->checkEnum($value, $schema, $path, $i);
}

// check const
if (isset($schema->const)) {
$this->checkConst($value, $schema, $path, $i);
}
}

/**
Expand Down

0 comments on commit 9a3d12a

Please sign in to comment.