blob: be46bbd46f44933184d0e0544ffe5e1fedba164e [file] [log] [blame]
// Copyright 2019 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_test
import (
"fmt"
"log"
"cuelang.org/go/cue"
)
func ExampleRuntime_Parse() {
const config = `
msg: "Hello \(place)!"
place: string | *"world"
`
var r cue.Runtime
instance, err := r.Compile("test", config)
if err != nil {
// handle error
}
str, _ := instance.Lookup("msg").String()
fmt.Println(str)
instance, _ = instance.Fill("you", "place")
str, _ = instance.Lookup("msg").String()
fmt.Println(str)
// Output:
// Hello world!
// Hello you!
}
func ExampleValue_Decode() {
type ab struct{ A, B int }
var x ab
var r cue.Runtime
i, _ := r.Compile("test", `{A: 2, B: 4}`)
_ = i.Value().Decode(&x)
fmt.Println(x)
i, _ = r.Compile("test", `{B: "foo"}`)
err := i.Value().Decode(&x)
fmt.Println(err)
// Output:
// {2 4}
// json: cannot unmarshal string into Go struct field ab.B of type int
}
func ExampleValue_Subsumes() {
// Check compatibility of successive APIs.
var r cue.Runtime
inst, err := r.Compile("apis", `
// Release notes:
// - You can now specify your age and your hobby!
V1 :: {
age: >=0 & <=100
hobby: string
}
// Release notes:
// - People get to be older than 100, so we relaxed it.
// - It seems not many people have a hobby, so we made it optional.
V2 :: {
age: >=0 & <=150 // people get older now
hobby?: string // some people don't have a hobby
}
// Release notes:
// - Actually no one seems to have a hobby nowadays anymore,
// so we dropped the field.
V3 :: {
age: >=0 & <=150
}`)
if err != nil {
fmt.Println(err)
// handle error
}
v1, err1 := inst.LookupField("V1")
v2, err2 := inst.LookupField("V2")
v3, err3 := inst.LookupField("V3")
if err1 != nil || err2 != nil || err3 != nil {
log.Println(err1, err2, err3)
}
// Is V2 backwards compatible with V1? In other words, does V2 subsume V1?
pass := v2.Value.Subsumes(v1.Value)
fmt.Println("V2 is backwards compatible with V1:", pass)
pass = v3.Value.Subsumes(v2.Value)
fmt.Println("V3 is backwards compatible with V2:", pass)
// Output:
// V2 is backwards compatible with V1: true
// V3 is backwards compatible with V2: false
}