diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-03-06 16:09:41 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-03-08 10:56:47 +0000 |
| commit | 8e75c913b6f9b09cab2ad31fd7d66ea0d1703de8 (patch) | |
| tree | 08556bc4e03b3550324770d80f9a02b057b12ad4 /prog/validation.go | |
| parent | 4097c8d7a8596ddbc9a9db7b7f39c5cbdb1bd742 (diff) | |
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.
Diffstat (limited to 'prog/validation.go')
| -rw-r--r-- | prog/validation.go | 14 |
1 files changed, 12 insertions, 2 deletions
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) |
