-
Notifications
You must be signed in to change notification settings - Fork 301
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pkg/encoding/yaml: hoist validate functionality
We need to start passing OpContexts to validate. We hoist the code to the internal yaml package in preparation of that This also removes an unwanted dependency on pkg/encoding/yaml. Issue #3649 Signed-off-by: Marcel van Lohuizen <[email protected]> Change-Id: Ie57195a76707fa21ae1709ccb6cca55fd2bdde1e Reviewed-on: https://cue.gerrithub.io/c/cue-lang/cue/+/1208005 Unity-Result: CUE porcuepine <[email protected]> Reviewed-by: Matthew Sackman <[email protected]> TryBot-Result: CUEcueckoo <[email protected]>
- Loading branch information
Showing
3 changed files
with
96 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
// Copyright 2025 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 | ||
// | ||
// https://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 yaml | ||
|
||
import ( | ||
"errors" | ||
"io" | ||
|
||
"cuelang.org/go/cue" | ||
"cuelang.org/go/internal/pkg" | ||
) | ||
|
||
// Validate validates YAML and confirms it is an instance of schema. | ||
// If the YAML source is a stream, every object must match v. | ||
func Validate(b []byte, v cue.Value) (bool, error) { | ||
d := NewDecoder("yaml.Validate", b) | ||
r := v.Context() | ||
for { | ||
expr, err := d.Decode() | ||
if err != nil { | ||
if err == io.EOF { | ||
return true, nil | ||
} | ||
return false, err | ||
} | ||
|
||
x := r.BuildExpr(expr) | ||
if err := x.Err(); err != nil { | ||
return false, err | ||
} | ||
|
||
// TODO: consider using subsumption again here. | ||
// Alternatives: | ||
// - allow definition of non-concrete list, | ||
// like list.Of(int), or []int. | ||
// - Introduce ! in addition to ?, allowing: | ||
// list!: [...] | ||
// if err := v.Subsume(inst.Value(), cue.Final()); err != nil { | ||
// return false, err | ||
// } | ||
x = v.Unify(x) | ||
if err := x.Err(); err != nil { | ||
return false, err | ||
} | ||
if err := x.Validate(cue.Concrete(true)); err != nil { | ||
// Strip error codes: incomplete errors are terminal in this case. | ||
var b pkg.Bottomer | ||
if errors.As(err, &b) { | ||
err = b.Bottom().Err | ||
} | ||
return false, err | ||
} | ||
} | ||
} | ||
|
||
// ValidatePartial validates YAML and confirms it matches the constraints | ||
// specified by v using unification. This means that b must be consistent with, | ||
// but does not have to be an instance of v. If the YAML source is a stream, | ||
// every object must match v. | ||
func ValidatePartial(b []byte, v cue.Value) (bool, error) { | ||
d := NewDecoder("yaml.ValidatePartial", b) | ||
r := v.Context() | ||
for { | ||
expr, err := d.Decode() | ||
if err != nil { | ||
if err == io.EOF { | ||
return true, nil | ||
} | ||
return false, err | ||
} | ||
|
||
x := r.BuildExpr(expr) | ||
if err := x.Err(); err != nil { | ||
return false, err | ||
} | ||
|
||
if x := v.Unify(x); x.Err() != nil { | ||
return false, x.Err() | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters