Проверить свойство с различными типами для данного условия - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу иметь разные проверки для одного и того же свойства при определенных условиях.Как мне использовать if-then для достижения этой цели?

Я пытался сделать oneOf, а затем другие if-then в зависимости от типа operator, который у меня есть.Поэтому, если у меня есть между , я хочу, чтобы value было что-то вроде [[1,2],[4,5]], но если у меня в , я хочу, чтобы value было [1,2,3] или ["a","b","c"]

Моя схема выглядит следующим образом:

%{
definitions: %{
  rule: %{
    type: "object",
    required: ["attribute", "operator", "value"],
    properties: %{
      attribute: %{
        enum: ["show_shop", "shop_item"]
      },
      operator: %{
        enum: ["in", "between"]
      },
    },
    oneOf: [
      %{
        if: %{definitions: %{rule: %{properties: %{operator: %{const: "between"}}}}},
        then: %{
          properties: %{
            value: %{
              type: "array",
              minItems: 1,
              items: %{
                oneOf: [
                  %{
                    type: "array",
                    items: [%{type: "number"}, %{type: "number"}],
                    additionalItems: false,
                    minItems: 2,
                    maxItems: 2
                  },
                  %{
                    type: "array",
                    items: [%{type: "null"}, %{type: "number"}],
                    additionalItems: false,
                    minItems: 2,
                    maxItems: 2
                  },
                  %{
                    type: "array",
                    items: [%{type: "number"}, %{type: "null"}],
                    additionalItems: false,
                    minItems: 2,
                    maxItems: 2
                  }
                ]
              }
            },
            additionalProperties: false
          }
        }
      },
      %{
        if: %{definitions: %{rule: %{properties: %{operator: %{const: "in"}}}}},
        then: %{
          properties: %{
            value: %{
              type: "array",
              items:  %{type: "number"},
              minItems: 1,
            },
            additionalProperties: false
          }
        }
      },
      %{
        if: %{definitions: %{rule: %{properties: %{operator: %{const: "in"}}}}},
        then: %{
          properties: %{
            value: %{
              type: "array",
              items:  %{type: "string"},
              minItems: 1,
            },
            additionalProperties: false
          }
        }
      }
    ]
  }
},
type: "array",
items: %{"$ref": "#/definitions/rule"},
minItems: 1

}

  • Что я хочу

[ { "value": [1,2,3,4], "operator": "between", "attribute": "show_shop" } ] -> должен выдавать ошибку, потому что оператор между должен принимать только массив массива

[ { "value": [ [1,3] ], "operator": "between", "attribute": "show_shop" } ] -> должен быть в порядке

[ { "value": [ [1,3] ], "operator": "in", "attribute": "show_shop" } ] -> должендать ошибку, потому что оператор in принимает только массив целых чисел или массив строк

[ { "value": ["a", "b"], "operator": "in", "attribute": "show_shop" } ] -> должно быть в порядке

  • Что я получаю

Независимо от оператора, если его значение составляет список списка или список чисел или список строк jsonявляется действительным.Это как if условие вообще не оценивается.Так что из всех моих предыдущих примеров я не получаю никаких ошибок.(Также у меня нет ошибок схемы)

...