blob: 5673524b2e16a3bc418cac2819269ed5fcce661d [file] [log] [blame]
// Copyright 2018 The CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cue
// validate returns whether there is any error, recursively.
func validate(ctx *context, v value) (err *bottom) {
eval := v.evalPartial(ctx)
if err, ok := eval.(*bottom); ok && err.code != codeIncomplete && err.code != codeCycle {
return eval.(*bottom)
}
switch x := eval.(type) {
case *structLit:
x, err = x.expandFields(ctx)
if err != nil {
return err
}
if ctx.maxDepth++; ctx.maxDepth > 20 {
return nil
}
for i, a := range x.arcs {
if a.optional {
continue
}
if err := validate(ctx, x.at(ctx, i)); err != nil {
ctx.maxDepth--
return err
}
}
ctx.maxDepth--
case *list:
// TODO: also validate types for open lists?
return validate(ctx, x.elem)
}
return nil
}