Tweak sequence treatment in fieldspecs

This commit is contained in:
Jeff Regan
2020-07-17 19:48:06 -07:00
committed by jregan
12 changed files with 162 additions and 51 deletions

View File

@@ -210,11 +210,11 @@ func (it FieldValueType) Validate(value string) error {
func (it FieldValueType) Tag() string {
switch it {
case String:
return yaml.StringTag
return yaml.NodeTagString
case Bool:
return yaml.BoolTag
return yaml.NodeTagBool
case Int:
return yaml.IntTag
return yaml.NodeTagInt
}
return ""
}
@@ -222,17 +222,17 @@ func (it FieldValueType) Tag() string {
func (it FieldValueType) TagForValue(value string) string {
switch it {
case String:
return yaml.StringTag
return yaml.NodeTagString
case Bool:
if _, err := strconv.ParseBool(string(it)); err != nil {
return ""
}
return yaml.BoolTag
return yaml.NodeTagBool
case Int:
if _, err := strconv.ParseInt(string(it), 0, 32); err != nil {
return ""
}
return yaml.IntTag
return yaml.NodeTagInt
}
return ""
}

View File

@@ -142,7 +142,7 @@ func (s *Set) substitute(field *yaml.RNode, ext *CliExtension) (bool, error) {
field.YNode().Value = res
// substitutions are always strings
field.YNode().Tag = yaml.StringTag
field.YNode().Tag = yaml.NodeTagString
return true, nil
}
@@ -379,7 +379,7 @@ func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) {
// values are always represented as strings the OpenAPI
// since the are unmarshalled into strings. Use double quote style to
// ensure this consistently.
v.YNode().Tag = yaml.StringTag
v.YNode().Tag = yaml.NodeTagString
v.YNode().Style = yaml.DoubleQuotedStyle
if t != "array" {
@@ -395,7 +395,7 @@ func (s SetOpenAPI) Filter(object *yaml.RNode) (*yaml.RNode, error) {
// create the list values
var elements []*yaml.Node
n := yaml.NewScalarRNode(s.Value).YNode()
n.Tag = yaml.StringTag
n.Tag = yaml.NodeTagString
n.Style = yaml.DoubleQuotedStyle
elements = append(elements, n)
for i := range s.ListValues {

View File

@@ -14,10 +14,10 @@ import (
// typeToTag maps OpenAPI schema types to yaml 1.2 tags
var typeToTag = map[string]string{
"string": StringTag,
"integer": IntTag,
"boolean": BoolTag,
"number": "!!float",
"string": NodeTagString,
"integer": NodeTagInt,
"boolean": NodeTagBool,
"number": NodeTagFloat,
}
// FormatNonStringStyle makes sure that values which parse as non-string values in yaml 1.1

View File

@@ -114,7 +114,7 @@ var valueToTagMap = func() map[string]string {
// https://yaml.org/type/null.html
values := []string{"~", "null", "Null", "NULL"}
for i := range values {
val[values[i]] = "!!null"
val[values[i]] = yaml.NodeTagNull
}
// https://yaml.org/type/bool.html
@@ -122,7 +122,7 @@ var valueToTagMap = func() map[string]string {
"y", "Y", "yes", "Yes", "YES", "true", "True", "TRUE", "on", "On", "ON", "n", "N", "no",
"No", "NO", "false", "False", "FALSE", "off", "Off", "OFF"}
for i := range values {
val[values[i]] = "!!bool"
val[values[i]] = yaml.NodeTagBool
}
// https://yaml.org/type/float.html
@@ -130,7 +130,7 @@ var valueToTagMap = func() map[string]string {
".nan", ".NaN", ".NAN", ".inf", ".Inf", ".INF",
"+.inf", "+.Inf", "+.INF", "-.inf", "-.Inf", "-.INF"}
for i := range values {
val[values[i]] = "!!float"
val[values[i]] = yaml.NodeTagFloat
}
return val

View File

@@ -35,7 +35,7 @@ type AnnotationSetter struct {
func (s AnnotationSetter) Filter(rn *RNode) (*RNode, error) {
// some tools get confused about the type if annotations are not quoted
v := NewScalarRNode(s.Value)
v.YNode().Tag = StringTag
v.YNode().Tag = NodeTagString
v.YNode().Style = yaml.SingleQuotedStyle
return rn.Pipe(
PathGetter{Path: []string{"metadata", "annotations"}, Create: yaml.MappingNode},
@@ -82,7 +82,7 @@ type LabelSetter struct {
func (s LabelSetter) Filter(rn *RNode) (*RNode, error) {
// some tools get confused about the type if labels are not quoted
v := NewScalarRNode(s.Value)
v.YNode().Tag = StringTag
v.YNode().Tag = NodeTagString
v.YNode().Style = yaml.SingleQuotedStyle
return rn.Pipe(
PathGetter{Path: []string{"metadata", "labels"}, Create: yaml.MappingNode},

View File

@@ -16,9 +16,21 @@ import (
)
const (
// NullNodeTag is the tag set for a yaml.Document that contains no data -- e.g. it isn't a
// Map, Slice, Document, etc
NullNodeTag = "!!null"
// NodeTagNull is the tag set for a yaml.Document that contains no data;
// e.g. it isn't a Map, Slice, Document, etc
NodeTagNull = "!!null"
NodeTagFloat = "!!float"
NodeTagString = "!!str"
NodeTagBool = "!!bool"
NodeTagInt = "!!int"
NodeTagMap = "!!map"
NodeTagEmpty = ""
// TODO: deprecate these
NullNodeTag = NodeTagNull
StringTag = NodeTagString
BoolTag = NodeTagBool
IntTag = NodeTagInt
)
// NullNode returns a RNode point represents a null; value
@@ -604,12 +616,6 @@ func (rn *RNode) VisitFields(fn func(node *MapNode) error) error {
return nil
}
const (
StringTag = "!!str"
BoolTag = "!!bool"
IntTag = "!!int"
)
// Elements returns the list of elements in the RNode.
// Returns an error for non-SequenceNodes.
func (rn *RNode) Elements() ([]*RNode, error) {