Skip to content

Commit

Permalink
Performance improvement (don't iterate over all validators for every …
Browse files Browse the repository at this point in the history
…property)
  • Loading branch information
jonasschmidt committed Feb 25, 2021
1 parent f9b447e commit a42495b
Showing 1 changed file with 38 additions and 38 deletions.
76 changes: 38 additions & 38 deletions lib/ex_json_schema/validator.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,40 +14,6 @@ defmodule ExJsonSchema.Validator do
ExJsonSchema.json_path()
) :: errors

@validators [
ExJsonSchema.Validator.AllOf,
ExJsonSchema.Validator.AnyOf,
ExJsonSchema.Validator.Const,
ExJsonSchema.Validator.Contains,
ExJsonSchema.Validator.ContentEncoding,
ExJsonSchema.Validator.ContentMediaType,
ExJsonSchema.Validator.Dependencies,
ExJsonSchema.Validator.Enum,
ExJsonSchema.Validator.ExclusiveMaximum,
ExJsonSchema.Validator.ExclusiveMinimum,
ExJsonSchema.Validator.Format,
ExJsonSchema.Validator.IfThenElse,
ExJsonSchema.Validator.Items,
ExJsonSchema.Validator.MaxItems,
ExJsonSchema.Validator.MaxLength,
ExJsonSchema.Validator.MaxProperties,
ExJsonSchema.Validator.Maximum,
ExJsonSchema.Validator.MinItems,
ExJsonSchema.Validator.MinLength,
ExJsonSchema.Validator.MinProperties,
ExJsonSchema.Validator.Minimum,
ExJsonSchema.Validator.MultipleOf,
ExJsonSchema.Validator.Not,
ExJsonSchema.Validator.OneOf,
ExJsonSchema.Validator.Pattern,
ExJsonSchema.Validator.Properties,
ExJsonSchema.Validator.PropertyNames,
ExJsonSchema.Validator.Ref,
ExJsonSchema.Validator.Required,
ExJsonSchema.Validator.Type,
ExJsonSchema.Validator.UniqueItems
]

@spec validate(Root.t() | ExJsonSchema.object(), ExJsonSchema.data()) ::
:ok | {:error, errors} | no_return
def validate(root, data, options \\ [])
Expand Down Expand Up @@ -113,10 +79,11 @@ defmodule ExJsonSchema.Validator do

def do_validation_errors(root = %Root{}, schema = %{}, data, path) do
schema
|> Enum.flat_map(fn property ->
Enum.flat_map(@validators, fn validator ->
validator.validate(root, schema, property, data, path)
end)
|> Enum.flat_map(fn {propertyName, _} = property ->
case validator_for(propertyName) do
nil -> []
validator -> validator.validate(root, schema, property, data, path)
end
end)
|> Enum.map(fn
%Error{path: nil} = error -> %{error | path: path}
Expand Down Expand Up @@ -156,4 +123,37 @@ defmodule ExJsonSchema.Validator do
end

defp format_errors({:error, _} = error, _error_formatter), do: error

defp validator_for("allOf"), do: ExJsonSchema.Validator.AllOf
defp validator_for("anyOf"), do: ExJsonSchema.Validator.AnyOf
defp validator_for("const"), do: ExJsonSchema.Validator.Const
defp validator_for("contains"), do: ExJsonSchema.Validator.Contains
defp validator_for("contentEncoding"), do: ExJsonSchema.Validator.ContentEncoding
defp validator_for("contentMediaType"), do: ExJsonSchema.Validator.ContentMediaType
defp validator_for("dependencies"), do: ExJsonSchema.Validator.Dependencies
defp validator_for("enum"), do: ExJsonSchema.Validator.Enum
defp validator_for("exclusiveMaximum"), do: ExJsonSchema.Validator.ExclusiveMaximum
defp validator_for("exclusiveMinimum"), do: ExJsonSchema.Validator.ExclusiveMinimum
defp validator_for("format"), do: ExJsonSchema.Validator.Format
defp validator_for("if"), do: ExJsonSchema.Validator.IfThenElse
defp validator_for("items"), do: ExJsonSchema.Validator.Items
defp validator_for("maxItems"), do: ExJsonSchema.Validator.MaxItems
defp validator_for("maxLength"), do: ExJsonSchema.Validator.MaxLength
defp validator_for("maxProperties"), do: ExJsonSchema.Validator.MaxProperties
defp validator_for("maximum"), do: ExJsonSchema.Validator.Maximum
defp validator_for("minItems"), do: ExJsonSchema.Validator.MinItems
defp validator_for("minLength"), do: ExJsonSchema.Validator.MinLength
defp validator_for("minProperties"), do: ExJsonSchema.Validator.MinProperties
defp validator_for("minimum"), do: ExJsonSchema.Validator.Minimum
defp validator_for("multipleOf"), do: ExJsonSchema.Validator.MultipleOf
defp validator_for("not"), do: ExJsonSchema.Validator.Not
defp validator_for("oneOf"), do: ExJsonSchema.Validator.OneOf
defp validator_for("pattern"), do: ExJsonSchema.Validator.Pattern
defp validator_for("properties"), do: ExJsonSchema.Validator.Properties
defp validator_for("propertyNames"), do: ExJsonSchema.Validator.PropertyNames
defp validator_for("$ref"), do: ExJsonSchema.Validator.Ref
defp validator_for("required"), do: ExJsonSchema.Validator.Required
defp validator_for("type"), do: ExJsonSchema.Validator.Type
defp validator_for("uniqueItems"), do: ExJsonSchema.Validator.UniqueItems
defp validator_for(_), do: nil
end

0 comments on commit a42495b

Please sign in to comment.