objectRetriever = $objectRetriever; $this->reader = new NodeReader([ 'prefixes' => [ 'json' => 'coid://json.co-n.net/' ] ]); } /** * Validate data against an element specification in an RDF node. * * @param mixed $data The data to validate. * @param Node $node The specification to validate against. */ public function validateAgainstNode($data, Node $node) { if ($this->reader->hasType($node, 'json:String')) Assert::string($data); elseif ($this->reader->hasType($node, 'json:Boolean')) Assert::boolean($data); elseif ($this->reader->hasType($node, 'json:Number')) Assert::numeric($data); elseif ($this->reader->hasType($node, 'json:Integer')) Assert::integer($data); elseif ($this->reader->hasType($node, 'json:Array')) Assert::isArray($data); elseif ($this->reader->hasType($node, 'json:Object')) { Assert::isArrayAccessible($data); foreach ($this->reader->getAllValuesNode($node, 'json:hasProperty') as $prop) { $key = $this->reader->getFirstValueString($prop, 'json:hasKey'); if ($this->reader->getFirstValueBool($prop, 'json:isRequired') == true) Assert::keyExists($data, $key); if (isset($data[$key])) $this->validateAgainstNode($data[$key], $prop); } } } /** * Validate data against a specification stored in CloudObjects. * * @param mixed $data The data to validate. * @param Node $node The COID of the specification. */ public function validateAgainstCOID($data, IRI $coid) { $object = $this->objectRetriever->getObject($coid); Assert::true($this->reader->hasType($object, 'json:Element'), "You can only validate data against JSON elements!"); $this->validateAgainstNode($data, $object); } }