@@ -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