This Commented CUE demonstrates how to transform YAML by reshaping some input data into different output.
file.cue
package example
// place the yaml input here with "-l"
input: _
// validate the input against a schema
input: #Schema
#Schema: {
owner?: {
name!: string
address?: string
}
pets?: [...#Pet]
#Pet: {
name!: string
species!: string & or(#Species)
breed?: string
age?: int & <50 // years
}
}
#Species: ["cat", "dog", "goldfish"]
// transform the input into the output
output: location: *input.owner.address | "Unknown"
output: petsBySpecies: {
for s in #Species {(s): [
if input.pets != _|_
for pet in input.pets
if pet.species == s {{
Name: pet.name
if pet.age != _|_ {
Age: pet.age
DoB: 2023 - pet.age
}
if pet.breed != _|_ {
Breed: pet.breed
}
Owner: input.owner.name
}},
]}
}
data.yml
owner:
name: Dorothy Cartwright
address: Ripon, North Yorkshire, England
pets:
- name: Charlie
species: cat
age: 15
- name: Lola
species: dog
breed: dachshund
- name: Fred
species: goldfish
age: 8
- name: George
species: cat
age: 5
TERMINAL
$ cue export .:example -l input: data.yml -e output --out yaml
location: Ripon, North Yorkshire, England
petsBySpecies:
cat:
- Name: Charlie
Age: 15
Owner: Dorothy Cartwright
DoB: 2008
- Name: George
Age: 5
Owner: Dorothy Cartwright
DoB: 2018
dog:
- Name: Lola
Breed: dachshund
Owner: Dorothy Cartwright
goldfish:
- Name: Fred
Age: 8
Owner: Dorothy Cartwright
DoB: 2015