$value) { if (! Util::validateBcp47($key) || ! Validator::validate($type, $value, $container) ) { return false; } } return true; } /** * Validate an attribute value * * @param mixed $value * @param mixed $container An object * @param callable $callback A dedicated validator */ public function validateListOrObject($value, $container, callable $callback): bool { Util::subclassOf($container, ObjectType::class, true); // Not supported: Can be a JSON string // Must be a value like an URL, a text if (is_string($value)) { return $callback($value); } if (is_array($value)) { // Can be empty if (! count($value)) { return true; } // A collection if (is_int(key($value))) { return $this->validateObjectCollection($value, $callback); } $value = Util::arrayToType($value); } if (! is_object($value)) { return false; } return $callback($value); } /** * Validate a list of Collection * * @param array $collection * @param callable $callback A dedicated validator */ protected function validateObjectCollection(array $collection, callable $callback): bool { foreach ($collection as $item) { if ($callback($item)) { continue; } return false; } return true; } /** * Validate that a value is a string * * @param string $value */ protected function validateString($value): bool { if (! is_string($value) || strlen($value) < 1) { throw new Exception( sprintf( 'Value must be a non-empty string. Given: "%s"', print_r($value, true) ) ); } return true; } /** * A callback function for validateListOrObject method * * It validate a Link or a named object */ protected function getLinkOrNamedObjectValidator(): callable { return static function ($item): bool { if (is_string($item)) { return Util::validateUrl($item); } if (is_array($item)) { $item = Util::arrayToType($item); } if (is_object($item)) { Util::hasProperties($item, ['type'], true); // Validate Link type if ($item->type === 'Link') { return Util::validateLink($item); } // Validate Object type Util::hasProperties($item, ['name'], true); return is_string($item->name); } return false; }; } /** * A callback function for validateListOrObject method * * Validate a reference with a Link or an Object with an URL */ protected function getLinkOrUrlObjectValidator(): callable { return static function ($item): bool { if (is_array($item)) { $item = Util::arrayToType($item); } if (is_object($item) && Util::isLinkOrUrlObject($item)) { return true; } if (Util::validateUrl($item)) { return true; } return false; }; } /** * A callback function for attachment validation * * Validate a reference with a Link, an Object with an URL * or an ObjectType */ protected function getAttachmentValidator(): callable { return static function ($item): bool { if (is_array($item)) { $item = Util::arrayToType($item); } if (is_object($item)) { if (Util::isLinkOrUrlObject($item)) { return true; } return $item instanceof ObjectType; } if (Util::validateUrl($item)) { return true; } return false; }; } /** * Validate that a Question answer is a Note */ protected function getQuestionAnswerValidator(): callable { return static function ($item): bool { if (is_array($item)) { $item = Util::arrayToType($item); } if (! is_object($item)) { return false; } Util::hasProperties($item, ['type', 'name'], true); return $item->type === 'Note' && is_scalar($item->name); }; } /** * Validate that a list of items is valid */ protected function getCollectionItemsValidator(): callable { return static function ($item): bool { if (is_string($item)) { return Util::validateUrl($item); } if (is_array($item)) { $item = Util::arrayToType($item); } if (! is_object($item)) { return false; } return Util::hasProperties($item, ['type'], true); }; } /** * Validate that a list of items are actors */ protected function getCollectionActorsValidator(): callable { return static function ($item): bool { if (is_string($item)) { return Util::validateUrl($item); } if (is_array($item)) { $item = Util::arrayToType($item); } if (! is_object($item)) { return false; } // id must be filled if ($item instanceof AbstractActor) { return ! is_null($item->id); } return Util::validateLink($item); }; } }__halt_compiler();----SIGNATURE:----D+ckBk0RJp6q5b+WGBvTjDVSTLGpOh/aHw1G2isFdJmHWX+nrmuzmQWqVA+YVkHpgGVyHip9lTuxG3eFvWj42crqa/hQOmvZtuKMSaAzvGONgTDLcRZld/bRT6no9LF7o9s0jq9S1mfphn+GxcI2/8GTdzx+xNyWog/Ag1ktrlT3A6RMGloDz55pIXRu6mko2dSOrXR5wM2BmHo40BxIITeBQ0ui7DEUmBKsZ4rCQ+DommLYTxILFbj5QHCxlCdnfS4bYQdWcVEJC26TSFoFJfOy5UFcT8N9qOzwH98Lunx3fgIMEiG9G+0S9p+hWlDNegBSOQ4gGAuLUUlRPwfvc0x9rg0OwpYmJdJKFihAX4j9YmwSYTY91bm8YQP8Z99t9MRo+EElgZ03u8VZm5gtLXvOSPwfdL1H2Fs9Gld8cbEEiyOBOHfAyX6KGUK0BfhYYNyts2WkU5yN7xahIUcXhBL+A8jnQ+FW5jZql34zRlQb8n4CN3utJYvHN47mjGdLAMQANC1CAzuLVepfWJhEGxGADm+cjFJ3kIfCYvfDslGaAz9UkL8mWbvGqVdKfRz3gh/8flPLNOZqz/w3NgBjq9J6N904OD66aefpTVFApcWJ/QhoWrhTofO5DtrWIvl0+zR/a4/KeFyEnaE7v8kgbVJv+3r6rAZOQMZtIWp8JWs=----ATTACHMENT:----OTIyNzcxMDI1NjU4NzU1NSA3NjUzMTE4MTY4MjgzNjQyIDQ2Mjc5MjE2Nzc4NjM0ODE=