From 8e75c913b6f9b09cab2ad31fd7d66ea0d1703de8 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 6 Mar 2024 16:09:41 +0100 Subject: prog: auto-set proper conditional fields in Deserialize() Treat all default union arguments as transient and reevaluate them after the call was fully parsed. Before conditional field patching, we do need to have performed arg validation, which also reevaluates conditions. To break the cycle, make validation configurable. --- prog/validation.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'prog/validation.go') diff --git a/prog/validation.go b/prog/validation.go index 13b7c33db..f38dcd1e8 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -21,15 +21,25 @@ func (p *Prog) debugValidate() { } } +func (p *Prog) validate() error { + return p.validateWithOpts(validationOptions{}) +} + type validCtx struct { target *Target + opts validationOptions args map[Arg]bool uses map[Arg]Arg } -func (p *Prog) validate() error { +type validationOptions struct { + ignoreTransient bool +} + +func (p *Prog) validateWithOpts(opts validationOptions) error { ctx := &validCtx{ target: p.Target, + opts: opts, args: make(map[Arg]bool), uses: make(map[Arg]Arg), } @@ -65,7 +75,7 @@ func (ctx *validCtx) validateCall(c *Call) error { return err } } - if err := c.checkConditions(ctx.target); err != nil { + if err := c.checkConditions(ctx.target, ctx.opts.ignoreTransient); err != nil { return err } return ctx.validateRet(c) -- cgit mrf-deployment