schema['type'] ?? ['null']; return $this->updateSchemaProperty('type', is_array($type) ? $type : [$type, 'null']); } /** @return static */ public function nonNullable() { $type = $this->schema['type'] ?? null; return $type === null ? $this->unsetSchemaProperty('type') : $this->updateSchemaProperty('type', is_array($type) ? $type[0] : $type); } /** @return static */ public function required() { return $this->updateSchemaProperty('required', true); } /** @return static */ public function optional() { return $this->unsetSchemaProperty('required'); } public function toArray(): array { return $this->schema; } public function toString(): string { $json = json_encode($this->schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRESERVE_ZERO_FRACTION); $error = json_last_error(); if ($error || $json === false) { throw new InvalidStateException(json_last_error_msg(), (string)$error); } return $json; } /** @return static */ protected function updateSchemaProperty(string $name, $value) { $clone = clone $this; $clone->schema[$name] = $value; return $clone; } /** @return static */ protected function unsetSchemaProperty(string $name) { $clone = clone $this; unset($clone->schema[$name]); return $clone; } }