* @license http://www.apache.org/licenses/LICENSE-2.0 * @link http://phpsx.org */ class JsonSchema implements GeneratorInterface { /** @var string */ private $refBase; public function __construct(string $refBase = '#/definitions/') { $this->refBase = $refBase; } public function generate(SchemaInterface $schema) { $data = $this->toArray( $schema->getType(), $schema->getDefinitions() ); return Parser::encode($data, JSON_PRETTY_PRINT); } /** * @param \PSX\Schema\TypeInterface $type * @param \PSX\Schema\DefinitionsInterface $definitions * @return array */ public function toArray(TypeInterface $type, DefinitionsInterface $definitions) { $object = $this->generateType($type); $result = [ 'definitions' => $this->generateDefinitions($definitions), ]; $result = array_merge($result, $object); return $result; } protected function generateDefinitions(DefinitionsInterface $definitions) { $result = []; $types = $definitions->getAllTypes(); ksort($types); foreach ($types as $ref => $type) { [$ns, $name] = TypeUtil::split($ref); $result[$name] = $this->generateType($type); } return $result; } protected function generateType(TypeInterface $type) { TypeUtil::normalize($type); if ($type instanceof StructType) { $data = $type->toArray(); if (isset($data['properties'])) { $data['properties'] = array_map(function ($property) { return $this->generateType($property); }, $data['properties']); } if (isset($data['$extends'])) { $extends = $data['$extends']; unset($data['$extends']); [$ns, $name] = TypeUtil::split($extends); return [ 'allOf' => [ ['$ref' => $this->refBase . $name], $data, ] ]; } else { return $data; } } elseif ($type instanceof MapType) { $data = $type->toArray(); if (isset($data['additionalProperties']) && $data['additionalProperties'] instanceof TypeInterface) { $data['additionalProperties'] = $this->generateType($data['additionalProperties']); } return $data; } elseif ($type instanceof ArrayType) { $data = $type->toArray(); if (isset($data['items']) && $data['items'] instanceof TypeInterface) { $data['items'] = $this->generateType($data['items']); } return $data; } elseif ($type instanceof UnionType) { $data = $type->toArray(); if (isset($data['oneOf'])) { $data['oneOf'] = array_map(function($type){ return $this->generateType($type); }, $data['oneOf']); } return $data; } elseif ($type instanceof IntersectionType) { $data = $type->toArray(); if (isset($data['allOf'])) { $data['allOf'] = array_map(function($type){ return $this->generateType($type); }, $data['allOf']); } return $data; } elseif ($type instanceof ReferenceType) { [$ns, $name] = TypeUtil::split($type->getRef()); return [ '$ref' => $this->refBase . $name ]; } elseif ($type instanceof AnyType) { return []; } else { return $type->toArray(); } } } __halt_compiler();----SIGNATURE:----pXjUaJo4I0EStDP6Ed6o5p7xh+gokulDlfxFneZwEh2Zt1gdJRngkE4D3eu6VVuD/KkZ9YQwtwYjirGNStsNNDZk4jbx3eVXeLhnDYyznOFdMggMhHQFt/B1j8ItPQyfnlXbD2ezxmWnAsJ3oJl4lQnpKl080TCaiMC2xLncd3j/OJbZV8l3b3tnVaxhbk3Kr0j06lwJ+DHdGXNaHhYfvSMkXCZLTWjXptmivQr6fOo8YqHYUr/02Ja4+3okbPe3xBCihQKoT+6vI2ZmlFzWUAkgr5AbJy9sxbkvW/BuchDpT6FI6o6PYkkburcKiFWzOzhIehZHohkbTZXBDA6/0DsbJIRYYjc8xySmbkHv6dJX5l99hinwakBoHYCHgQZJgOWROw5QLM9Lw4fvqHnGZI0yPPzWV9TwRVqLKR6Na3oXDpuFtAQWvIKPJn3awcUohiflTI0qJxiITQ10W87ZXjyZ3L+rPi7rHY4X60hmotgrALHMsUZHenhDew4vJnFkBwK3+pQpjHlVbn1rqTidZCxZljMCndc7Qc+haXXzf6tY3UlATE1NkcGVRD94MBg8MfSJa+n5VCpZSw5VgJtw4mnHgGulYSeUx4my9Rsjpybedsqs0amI4ZKpsZrx3uDN//VqoudeuhLfcSSGsPGlPMe6LzUOb7dtnOTissa7Uo4=----ATTACHMENT:----Mjc5MjEzNTE0MjgwNjk0NyAzNTc0NjAxNTUxMTIyOTQ4IDU1OTk0MDQwMjAwNzgzMDY=