Skip to content

Commit 46f65f5

Browse files
committed
fix(ext-core): depp validation
1 parent d3882b3 commit 46f65f5

1 file changed

Lines changed: 34 additions & 14 deletions

File tree

lib/apix.schema.extensions/core.ex

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,22 +176,42 @@ defmodule Apix.Schema.Extensions.Core do
176176
end
177177
|> struct(data: it)
178178

179-
context_or_ast
180-
|> case do
181-
%Ast{} = ast ->
182-
ast.validators
179+
ast =
180+
case context_or_ast do
181+
%Ast{} = ast ->
182+
ast
183183

184-
%Context{} = context ->
185-
context.ast.validators
186-
end
187-
|> Enum.reduce({:ok, context}, fn
188-
validator, {:ok, context} ->
189-
invoke_validator(context, validator)
184+
%Context{} = context ->
185+
context.ast
186+
end
190187

191-
validator, {:error, context} ->
192-
{_status, context} = invoke_validator(context, validator)
193-
{:error, context}
194-
end)
188+
result =
189+
Enum.reduce(ast.validators, {:ok, context}, fn
190+
validator, {:ok, context} ->
191+
invoke_validator(context, validator)
192+
193+
validator, {:error, context} ->
194+
{_status, context} = invoke_validator(context, validator)
195+
{:error, context}
196+
end)
197+
198+
with {:ok, _context} <- result,
199+
parent_context = %Context{module: m, schema: s} when not is_nil(m) or not is_nil(s) <- Apix.Schema.get_schema(ast),
200+
parent_context <- Context.bind_args(parent_context, ast.args),
201+
{:ok, _parent_context} <- validate_context(it, parent_context) do
202+
result
203+
else
204+
# parent_context not found, stop recursion
205+
nil ->
206+
result
207+
208+
# Empty parent_context, stop recursion
209+
%Context{module: nil, schema: nil} ->
210+
result
211+
212+
error ->
213+
error
214+
end
195215
end
196216

197217
defp invoke_validator(context, {m, f, a} = _validator) do

0 commit comments

Comments
 (0)