Closed Pilatch closed 6 years ago
By default, JSON Schema ignores properties that are not specified. You can change that behaviour by adding "additionalProperties" => false
to your schema, then your example would fail. A more in-depth explanation of how objects and properties work can be found here: https://spacetelescope.github.io/understanding-json-schema/reference/object.html#properties
Found the problem. It errors out, which is the expected behavior, when you don't pipe. ExJsonSchema.Validator.validate(schema, foo)
will produce the error messages, but foo |> ExJsonSchema.Validator.validate(schema)
does not. This is probably because I misunderstand how Elixir handles partial function application.
defmodule Bug_Report do
def main do
schema = %{
"type" => "object",
"properties" => %{
"foo" => %{
"type" => "number"
},
"bar" => %{
"type" => ["number", "null"]
},
"baz" => %{
"type" => "string"
},
},
"additionalProperties" => false
} |> ExJsonSchema.Schema.resolve
foo = %{
"foo" => "Hello",
"bar" => false,
"baz" => 123
}
case ExJsonSchema.Validator.validate(schema, foo) do
:ok -> foo |> inspect |> IO.puts
# Even giving the validator an object with no fields that exist in the schema results in :ok.
{:error, messages} -> messages |> inspect |> IO.puts
end
end
end
Bug_Report.main
Yeah, the |>
operator is very specific, it passes the value on the left side as the first parameter to the function on the right side. In this case, it doesn't work unfortunately (actually I realized much later that the payload should be the first parameter to validate
and the schema the second, but I didn't want to introduce that breaking change just to make things a bit more convenient).
Ah thanks. I'm coming from Elm, where we pipe to the last parameter.
👍
What am I doing wrong here?
main.exs
mix.exs