Почему схема glTF определяет перечисления как это? - PullRequest
1 голос
/ 23 мая 2019

Если я ищу «enum» в схеме glTF 2.0, я вижу множество определений перечислений, таких как:

        "type": {
            "description": "Specifies if the camera uses a perspective or orthographic projection.",
            "gltf_detailedDescription": "Specifies if the camera uses a perspective or orthographic projection.  Based on this, either the camera's `perspective` or `orthographic` property will be defined.",
            "anyOf": [
                {
                    "enum": [ "perspective" ]
                },
                {
                    "enum": [ "orthographic" ]
                },
                {
                    "type": "string"
                }
            ]
        },

(из схемы камеры )

У меня есть несколько вопросов по этому поводу:

  1. Я не понимаю, почему это anyOf вместо oneOf? Насколько я понимаю, тип камеры - ЛИБО перспективный или орфографический, и мое понимание схемы json заключается в том, что 'anyOf' позволяет проверять несколько значений в массиве ).

  2. Я не понимаю поле "type": "string"? Мне кажется, что любое строковое значение будет допустимым? Это кажется несовместимым с определением камеры glTF?

Есть несколько экземпляров перечислений, подобных этому. смотрите также: здесь здесь

Заранее благодарим за любую ясность, которую кто-то может предоставить.

1 Ответ

1 голос
/ 23 мая 2019

В то время (2017) мы использовали черновик схемы JSON v4, и поддержка перечислений была не на том уровне, на котором нам это было нужно. Ранее был простой список перечислений, но я попросил, чтобы в схеме были описания для каждого перечисления. Это лучше документирует отдельные значения перечисления в схеме и позволяет программному обеспечению форматирования отображать описание отдельного значения перечисления. Я подал вопрос об этом здесь:

https://github.com/KhronosGroup/glTF/issues/891

Далее в этом вопросе была обнаружена проблема с oneOf, которая делала его несовместимым с TypeScript, и было принято решение переключиться на anyOf. Несмотря на это, вы все еще можете выбрать только одно из доступных перечислений.

Позже, в Запросе на извлечение, в котором реализовано это изменение, один из редакторов спецификаций объяснил , что дополнительный "type" : "string" на конце предназначен для обеспечения будущей прямой совместимости. По сути это означает, что расширениям glTF 2.0 разрешено (и рекомендуется) определять новые значения enum, которых нет в базовой схеме glTF 2.0, и они могут делать это, не нарушая схему. Однако они не могут произвольно добавлять новые поля, поскольку схема является строгой. Новые поля должны быть помещены в объект extension или extras с соответствующим именем. Но новые перечисления могут идти прямо в ту же область, где находятся существующие перечисления.

В конечном итоге мы получили схему, которая может показаться немного громоздкой для людей, но хорошо работает в широком спектре проверочного программного обеспечения, которое работает со схемами JSON. И люди могут просто взглянуть на Справочник свойств README вместо файлов необработанной схемы, это проще для глаз.

...