From 9a3d12a2687d54317f5254dda8ba15ec042dd016 Mon Sep 17 00:00:00 2001 From: Martin Helmich Date: Tue, 17 Apr 2018 18:27:37 +0200 Subject: [PATCH] Implement ConstConstraint --- src/JsonSchema/ConstraintError.php | 2 + .../Constraints/ConstConstraint.php | 54 +++++++++++++++++++ src/JsonSchema/Constraints/Constraint.php | 16 ++++++ src/JsonSchema/Constraints/Factory.php | 1 + .../Constraints/UndefinedConstraint.php | 5 ++ 5 files changed, 78 insertions(+) create mode 100644 src/JsonSchema/Constraints/ConstConstraint.php diff --git a/src/JsonSchema/ConstraintError.php b/src/JsonSchema/ConstraintError.php index 45e9539a..b3dd9363 100644 --- a/src/JsonSchema/ConstraintError.php +++ b/src/JsonSchema/ConstraintError.php @@ -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'; @@ -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', diff --git a/src/JsonSchema/Constraints/ConstConstraint.php b/src/JsonSchema/Constraints/ConstConstraint.php new file mode 100644 index 00000000..08321e62 --- /dev/null +++ b/src/JsonSchema/Constraints/ConstConstraint.php @@ -0,0 +1,54 @@ + + */ +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)); + } +} diff --git a/src/JsonSchema/Constraints/Constraint.php b/src/JsonSchema/Constraints/Constraint.php index 51b5a98a..389e0f53 100644 --- a/src/JsonSchema/Constraints/Constraint.php +++ b/src/JsonSchema/Constraints/Constraint.php @@ -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 * diff --git a/src/JsonSchema/Constraints/Factory.php b/src/JsonSchema/Constraints/Factory.php index 4e771c19..9c0f4f21 100644 --- a/src/JsonSchema/Constraints/Factory.php +++ b/src/JsonSchema/Constraints/Factory.php @@ -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' diff --git a/src/JsonSchema/Constraints/UndefinedConstraint.php b/src/JsonSchema/Constraints/UndefinedConstraint.php index 3b0c8eb0..02f14c0b 100644 --- a/src/JsonSchema/Constraints/UndefinedConstraint.php +++ b/src/JsonSchema/Constraints/UndefinedConstraint.php @@ -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); + } } /**