go-yaml/ast/ast.go

823 lines
18 KiB
Go
Raw Normal View History

2019-10-16 18:21:01 +09:00
package ast
import (
"fmt"
"math"
"strconv"
"strings"
"github.com/goccy/go-yaml/token"
)
2019-10-21 03:33:41 +09:00
// NodeType type identifier of node
type NodeType int
const (
2019-10-21 03:49:01 +09:00
// UnknownNodeType type identifier for default
2019-10-21 03:33:41 +09:00
UnknownNodeType NodeType = iota
2019-10-21 03:49:01 +09:00
// DocumentType type identifier for document node
2019-10-21 03:33:41 +09:00
DocumentType
2019-10-21 03:49:01 +09:00
// NullType type identifier for null node
2019-10-21 03:33:41 +09:00
NullType
2019-10-21 03:49:01 +09:00
// BoolType type identifier for boolean node
2019-10-21 03:33:41 +09:00
BoolType
2019-10-21 03:49:01 +09:00
// IntegerType type identifier for integer node
2019-10-21 03:33:41 +09:00
IntegerType
2019-10-21 03:49:01 +09:00
// FloatType type identifier for float node
2019-10-21 03:33:41 +09:00
FloatType
2019-10-21 03:49:01 +09:00
// InfinityType type identifier for infinity node
2019-10-21 03:33:41 +09:00
InfinityType
2019-10-21 03:49:01 +09:00
// NanType type identifier for nan node
2019-10-21 03:33:41 +09:00
NanType
2019-10-21 03:49:01 +09:00
// StringType type identifier for string node
2019-10-21 03:33:41 +09:00
StringType
2019-10-21 03:49:01 +09:00
// MergeKeyType type identifier for merge key node
2019-10-21 03:33:41 +09:00
MergeKeyType
2019-10-21 03:49:01 +09:00
// LiteralType type identifier for literal node
2019-10-21 03:33:41 +09:00
LiteralType
2019-10-21 03:49:01 +09:00
// FlowMappingType type identifier for flow mapping node
2019-10-21 03:33:41 +09:00
FlowMappingType
2019-10-21 03:49:01 +09:00
// MappingCollectionType type identifier for mapping collection node
2019-10-21 03:33:41 +09:00
MappingCollectionType
2019-10-21 03:49:01 +09:00
// MappingValueType type identifier for mapping value node
2019-10-21 03:33:41 +09:00
MappingValueType
2019-10-21 03:49:01 +09:00
// FlowSequenceType type identifier for flow sequence node
2019-10-21 03:33:41 +09:00
FlowSequenceType
2019-10-21 03:49:01 +09:00
// SequenceType type identifier for sequence node
2019-10-21 03:33:41 +09:00
SequenceType
2019-10-21 03:49:01 +09:00
// AnchorType type identifier for anchor node
2019-10-21 03:33:41 +09:00
AnchorType
2019-10-21 03:49:01 +09:00
// AliasType type identifier for alias node
2019-10-21 03:33:41 +09:00
AliasType
2019-10-21 03:49:01 +09:00
// DirectiveType type identifier for directive node
2019-10-21 03:33:41 +09:00
DirectiveType
2019-10-21 03:49:01 +09:00
// TagType type identifier for tag node
2019-10-21 03:33:41 +09:00
TagType
)
2019-10-24 23:51:50 +09:00
// String node type identifier to text
func (t NodeType) String() string {
switch t {
case UnknownNodeType:
return "UnknownNode"
case DocumentType:
return "Document"
case NullType:
return "Null"
case BoolType:
return "Bool"
case IntegerType:
return "Integer"
case FloatType:
return "Float"
case InfinityType:
return "Infinity"
case NanType:
return "Nan"
case StringType:
return "String"
case MergeKeyType:
return "MergeKey"
case LiteralType:
return "Literal"
case FlowMappingType:
return "FlowMapping"
case MappingCollectionType:
return "MappingCollection"
case MappingValueType:
return "MappingValue"
case FlowSequenceType:
return "FlowSequence"
case SequenceType:
return "Sequence"
case AnchorType:
return "Anchor"
case AliasType:
return "Alias"
case DirectiveType:
return "Directive"
case TagType:
return "Tag"
}
return ""
}
2019-10-21 03:33:41 +09:00
// Node type of node
type Node interface {
// String node to text
String() string
// GetToken returns token instance
GetToken() *token.Token
// Type returns type of node
Type() NodeType
}
// Document type of Document
2019-10-16 18:21:01 +09:00
type Document struct {
2019-10-21 03:33:41 +09:00
// Nodes all nodes in document
2019-10-16 18:21:01 +09:00
Nodes []Node
}
2019-10-21 03:33:41 +09:00
// Type returns DocumentType
func (d *Document) Type() NodeType { return DocumentType }
// String document to text
2019-10-16 18:21:01 +09:00
func (d *Document) String() string {
values := []string{}
for _, node := range d.Nodes {
values = append(values, strings.TrimLeft(node.String(), " "))
}
return strings.Join(values, "\n")
}
2019-10-21 03:33:41 +09:00
// ScalarNode type for scalar node
2019-10-16 18:21:01 +09:00
type ScalarNode interface {
Node
GetValue() interface{}
}
2019-10-21 03:33:41 +09:00
// Null create node for null value
func Null(tk *token.Token) Node {
return &NullNode{
Token: tk,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
// Bool create node for boolean value
func Bool(tk *token.Token) Node {
b, _ := strconv.ParseBool(tk.Value)
return &BoolNode{
Token: tk,
Value: b,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
// Integer create node for integer value
func Integer(tk *token.Token) Node {
i, _ := strconv.ParseInt(tk.Value, 10, 64)
return &IntegerNode{
Token: tk,
Value: i,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
// Float create node for float value
func Float(tk *token.Token) Node {
f, _ := strconv.ParseFloat(tk.Value, 64)
return &FloatNode{
Token: tk,
Value: f,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
// Infinity create node for .inf or -.inf value
func Infinity(tk *token.Token) Node {
node := &InfinityNode{
Token: tk,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
switch tk.Value {
case ".inf":
node.Value = math.Inf(0)
case "-.inf":
node.Value = math.Inf(-1)
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
return node
}
// Nan create node for .nan value
func Nan(tk *token.Token) Node {
return &NanNode{Token: tk}
}
// String create node for string value
func String(tk *token.Token) Node {
return &StringNode{
Token: tk,
Value: tk.Value,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
// MergeKey create node for merge key ( << )
func MergeKey(tk *token.Token) Node {
return &MergeKeyNode{
Token: tk,
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
}
2019-10-16 18:21:01 +09:00
2019-10-21 03:33:41 +09:00
// NullNode type of null node
2019-10-16 18:21:01 +09:00
type NullNode struct {
ScalarNode
Token *token.Token
}
2019-10-21 03:33:41 +09:00
// Type returns NullType
func (n *NullNode) Type() NodeType { return NullType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *NullNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns nil value
2019-10-16 18:21:01 +09:00
func (n *NullNode) GetValue() interface{} {
return nil
}
2019-10-21 03:33:41 +09:00
// String returns `null` text
2019-10-16 18:21:01 +09:00
func (n *NullNode) String() string {
return "null"
}
2019-10-21 03:33:41 +09:00
// IntegerNode type of integer node
2019-10-16 18:21:01 +09:00
type IntegerNode struct {
ScalarNode
Token *token.Token
Value int64
}
2019-10-21 03:33:41 +09:00
// Type returns IntegerType
func (n *IntegerNode) Type() NodeType { return IntegerType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *IntegerNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns int64 value
2019-10-16 18:21:01 +09:00
func (n *IntegerNode) GetValue() interface{} {
return n.Value
}
2019-10-21 03:33:41 +09:00
// String int64 to text
2019-10-16 18:21:01 +09:00
func (n *IntegerNode) String() string {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// FloatNode type of float node
2019-10-16 18:21:01 +09:00
type FloatNode struct {
ScalarNode
Token *token.Token
Precision int
Value float64
}
2019-10-21 03:33:41 +09:00
// Type returns FloatType
func (n *FloatNode) Type() NodeType { return FloatType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *FloatNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns float64 value
2019-10-16 18:21:01 +09:00
func (n *FloatNode) GetValue() interface{} {
return n.Value
}
2019-10-21 03:33:41 +09:00
// String float64 to text
2019-10-16 18:21:01 +09:00
func (n *FloatNode) String() string {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// StringNode type of string node
2019-10-16 18:21:01 +09:00
type StringNode struct {
ScalarNode
Token *token.Token
Value string
}
2019-10-21 03:33:41 +09:00
// Type returns StringType
func (n *StringNode) Type() NodeType { return StringType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *StringNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns string value
2019-10-16 18:21:01 +09:00
func (n *StringNode) GetValue() interface{} {
return n.Value
}
2019-10-21 03:33:41 +09:00
// String string value to text with quote if required
2019-10-16 18:21:01 +09:00
func (n *StringNode) String() string {
switch n.Token.Type {
case token.SingleQuoteType:
return fmt.Sprintf(`'%s'`, n.Value)
case token.DoubleQuoteType:
return fmt.Sprintf(`"%s"`, n.Value)
}
return n.Value
}
2019-10-21 03:33:41 +09:00
// LiteralNode type of literal node
2019-10-16 18:21:01 +09:00
type LiteralNode struct {
ScalarNode
Start *token.Token
Value *StringNode
}
2019-10-21 03:33:41 +09:00
// Type returns LiteralType
func (n *LiteralNode) Type() NodeType { return LiteralType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *LiteralNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// GetValue returns string value
2019-10-16 18:21:01 +09:00
func (n *LiteralNode) GetValue() interface{} {
return n.Value.GetValue()
}
2019-10-21 03:33:41 +09:00
// String literal to text
2019-10-16 18:21:01 +09:00
func (n *LiteralNode) String() string {
return n.Value.String()
}
2019-10-21 03:33:41 +09:00
// MergeKeyNode type of merge key node
2019-10-16 18:21:01 +09:00
type MergeKeyNode struct {
ScalarNode
Token *token.Token
}
2019-10-21 03:33:41 +09:00
// Type returns MergeKeyType
func (n *MergeKeyNode) Type() NodeType { return MergeKeyType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *MergeKeyNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns '<<' value
2019-10-16 18:21:01 +09:00
func (n *MergeKeyNode) GetValue() interface{} {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// String returns '<<' value
2019-10-16 18:21:01 +09:00
func (n *MergeKeyNode) String() string {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// BoolNode type of boolean node
2019-10-16 18:21:01 +09:00
type BoolNode struct {
ScalarNode
Token *token.Token
Value bool
}
2019-10-21 03:33:41 +09:00
// Type returns BoolType
func (n *BoolNode) Type() NodeType { return BoolType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *BoolNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns boolean value
2019-10-16 18:21:01 +09:00
func (n *BoolNode) GetValue() interface{} {
return n.Value
}
2019-10-21 03:33:41 +09:00
// String boolean to text
2019-10-16 18:21:01 +09:00
func (n *BoolNode) String() string {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// InfinityNode type of infinity node
2019-10-16 18:21:01 +09:00
type InfinityNode struct {
ScalarNode
Token *token.Token
Value float64
}
2019-10-21 03:33:41 +09:00
// Type returns InfinityType
func (n *InfinityNode) Type() NodeType { return InfinityType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *InfinityNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns math.Inf(0) or math.Inf(-1)
2019-10-16 18:21:01 +09:00
func (n *InfinityNode) GetValue() interface{} {
return n.Value
}
2019-10-21 03:33:41 +09:00
// String infinity to text
2019-10-16 18:21:01 +09:00
func (n *InfinityNode) String() string {
return n.Token.Value
}
2019-10-21 03:33:41 +09:00
// NanNode type of nan node
2019-10-16 18:21:01 +09:00
type NanNode struct {
ScalarNode
Token *token.Token
}
2019-10-21 03:33:41 +09:00
// Type returns NanType
func (n *NanNode) Type() NodeType { return NanType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *NanNode) GetToken() *token.Token {
return n.Token
}
2019-10-21 03:33:41 +09:00
// GetValue returns math.NaN()
2019-10-16 18:21:01 +09:00
func (n *NanNode) GetValue() interface{} {
return math.NaN()
}
2019-10-21 03:33:41 +09:00
// String returns .nan
2019-10-16 18:21:01 +09:00
func (n *NanNode) String() string {
return n.Token.Value
}
2019-10-24 23:52:43 +09:00
// MapNode interface of FlowMappingNode / MappingValueNode / MappingCollectionNode
type MapNode interface {
MapRange() *MapNodeIter
}
// MapNodeIter is an iterator for ranging over a MapNode
type MapNodeIter struct {
values []*MappingValueNode
idx int
}
const (
startRangeIndex = -1
)
// Next advances the map iterator and reports whether there is another entry.
// It returns false when the iterator is exhausted.
func (m *MapNodeIter) Next() bool {
m.idx++
next := m.idx < len(m.values)
return next
}
// Key returns the key of the iterator's current map node entry.
func (m *MapNodeIter) Key() Node {
return m.values[m.idx].Key
}
// Value returns the value of the iterator's current map node entry.
func (m *MapNodeIter) Value() Node {
return m.values[m.idx].Value
}
2019-10-21 03:33:41 +09:00
// FlowMappingNode type of flow mapping node
2019-10-16 18:21:01 +09:00
type FlowMappingNode struct {
Start *token.Token
End *token.Token
Values []*MappingValueNode
}
2019-10-21 03:33:41 +09:00
// Type returns FlowMappingType
func (n *FlowMappingNode) Type() NodeType { return FlowMappingType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *FlowMappingNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String flow mapping to text
2019-10-16 18:21:01 +09:00
func (n *FlowMappingNode) String() string {
values := []string{}
for _, value := range n.Values {
values = append(values, strings.TrimLeft(value.String(), " "))
}
return fmt.Sprintf("{%s}", strings.Join(values, ", "))
}
2019-10-24 23:52:43 +09:00
// MapRange implements MapNode protocol
func (n *FlowMappingNode) MapRange() *MapNodeIter {
return &MapNodeIter{
idx: startRangeIndex,
values: n.Values,
}
}
2019-10-21 03:33:41 +09:00
// MappingCollectionNode type of mapping collection node
2019-10-16 18:21:01 +09:00
type MappingCollectionNode struct {
Start *token.Token
Values []Node
}
2019-10-21 03:33:41 +09:00
// Type returns MappingCollectionType
func (n *MappingCollectionNode) Type() NodeType { return MappingCollectionType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *MappingCollectionNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String mapping collection to text
2019-10-16 18:21:01 +09:00
func (n *MappingCollectionNode) String() string {
values := []string{}
for _, value := range n.Values {
values = append(values, value.String())
}
return strings.Join(values, "\n")
}
2019-10-24 23:52:43 +09:00
func (n *MappingCollectionNode) toMappingValues() []*MappingValueNode {
values := []*MappingValueNode{}
for _, value := range n.Values {
if mvnode, ok := value.(*MappingValueNode); ok {
values = append(values, mvnode)
} else if c, ok := value.(*MappingCollectionNode); ok {
values = append(values, c.toMappingValues()...)
} else if fmnode, ok := value.(*FlowMappingNode); ok {
values = append(values, fmnode.Values...)
}
}
return values
}
// MapRange implements MapNode protocol
func (n *MappingCollectionNode) MapRange() *MapNodeIter {
return &MapNodeIter{
idx: startRangeIndex,
values: n.toMappingValues(),
}
}
2019-10-21 03:33:41 +09:00
// MappingValueNode type of mapping value
2019-10-16 18:21:01 +09:00
type MappingValueNode struct {
Start *token.Token
Key Node
Value Node
}
2019-10-21 03:33:41 +09:00
// Type returns MappingValueType
func (n *MappingValueNode) Type() NodeType { return MappingValueType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *MappingValueNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String mapping value to text
2019-10-16 18:21:01 +09:00
func (n *MappingValueNode) String() string {
space := strings.Repeat(" ", n.Key.GetToken().Position.Column-1)
keyIndentLevel := n.Key.GetToken().Position.IndentLevel
valueIndentLevel := n.Value.GetToken().Position.IndentLevel
if _, ok := n.Value.(ScalarNode); ok {
return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String())
} else if keyIndentLevel < valueIndentLevel {
return fmt.Sprintf("%s%s:\n%s", space, n.Key.String(), n.Value.String())
} else if _, ok := n.Value.(*FlowSequenceNode); ok {
return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String())
} else if _, ok := n.Value.(*AnchorNode); ok {
return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String())
} else if _, ok := n.Value.(*AliasNode); ok {
return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String())
}
return fmt.Sprintf("%s%s:\n%s", space, n.Key.String(), n.Value.String())
}
2019-10-24 23:52:43 +09:00
// MapRange implements MapNode protocol
func (n *MappingValueNode) MapRange() *MapNodeIter {
return &MapNodeIter{
idx: startRangeIndex,
values: []*MappingValueNode{n},
}
}
// ArrayNode interface of FlowSequenceNode / SequenceNode
type ArrayNode interface {
ArrayRange() *ArrayNodeIter
}
// ArrayNodeIter is an iterator for ranging over a ArrayNode
type ArrayNodeIter struct {
values []Node
idx int
}
// Next advances the array iterator and reports whether there is another entry.
// It returns false when the iterator is exhausted.
func (m *ArrayNodeIter) Next() bool {
m.idx++
next := m.idx < len(m.values)
return next
}
// Value returns the value of the iterator's current array entry.
func (m *ArrayNodeIter) Value() Node {
return m.values[m.idx]
}
// Len returns length of array
func (m *ArrayNodeIter) Len() int {
return len(m.values)
}
2019-10-21 03:33:41 +09:00
// FlowSequenceNode type of sequence node
2019-10-16 18:21:01 +09:00
type FlowSequenceNode struct {
Start *token.Token
End *token.Token
Values []Node
}
2019-10-21 03:33:41 +09:00
// Type returns FlowSequenceType
func (n *FlowSequenceNode) Type() NodeType { return FlowSequenceType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *FlowSequenceNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String flow sequence to text
2019-10-16 18:21:01 +09:00
func (n *FlowSequenceNode) String() string {
values := []string{}
for _, value := range n.Values {
values = append(values, value.String())
}
return fmt.Sprintf("[%s]", strings.Join(values, ", "))
}
2019-10-24 23:52:43 +09:00
// ArrayRange implements ArrayNode protocol
func (n *FlowSequenceNode) ArrayRange() *ArrayNodeIter {
return &ArrayNodeIter{
idx: startRangeIndex,
values: n.Values,
}
}
2019-10-21 03:33:41 +09:00
// SequenceNode type of sequence node
2019-10-16 18:21:01 +09:00
type SequenceNode struct {
Start *token.Token
Values []Node
}
2019-10-21 03:33:41 +09:00
// Type returns SequenceType
func (n *SequenceNode) Type() NodeType { return SequenceType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *SequenceNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String sequence to text
2019-10-16 18:21:01 +09:00
func (n *SequenceNode) String() string {
space := strings.Repeat(" ", n.Start.Position.Column-1)
values := []string{}
for _, value := range n.Values {
valueStr := value.String()
splittedValues := strings.Split(valueStr, "\n")
trimmedFirstValue := strings.TrimLeft(splittedValues[0], " ")
diffLength := len(splittedValues[0]) - len(trimmedFirstValue)
newValues := []string{trimmedFirstValue}
for i := 1; i < len(splittedValues); i++ {
trimmed := splittedValues[i][diffLength:]
newValues = append(newValues, fmt.Sprintf("%s %s", space, trimmed))
}
newValue := strings.Join(newValues, "\n")
values = append(values, fmt.Sprintf("%s- %s", space, newValue))
}
return strings.Join(values, "\n")
}
2019-10-24 23:52:43 +09:00
// ArrayRange implements ArrayNode protocol
func (n *SequenceNode) ArrayRange() *ArrayNodeIter {
return &ArrayNodeIter{
idx: startRangeIndex,
values: n.Values,
}
}
2019-10-21 03:33:41 +09:00
// AnchorNode type of anchor node
2019-10-16 18:21:01 +09:00
type AnchorNode struct {
Start *token.Token
Name Node
Value Node
}
2019-10-21 03:33:41 +09:00
// Type returns AnchorType
func (n *AnchorNode) Type() NodeType { return AnchorType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *AnchorNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String anchor to text
2019-10-16 18:21:01 +09:00
func (n *AnchorNode) String() string {
2019-10-19 22:01:36 +09:00
value := n.Value.String()
if len(strings.Split(value, "\n")) > 1 {
return fmt.Sprintf("&%s\n%s", n.Name.String(), value)
}
return fmt.Sprintf("&%s %s", n.Name.String(), value)
2019-10-16 18:21:01 +09:00
}
2019-10-21 03:33:41 +09:00
// AliasNode type of alias node
2019-10-16 18:21:01 +09:00
type AliasNode struct {
Start *token.Token
Value Node
}
2019-10-21 03:33:41 +09:00
// Type returns AliasType
func (n *AliasNode) Type() NodeType { return AliasType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *AliasNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String alias to text
2019-10-16 18:21:01 +09:00
func (n *AliasNode) String() string {
return fmt.Sprintf("*%s", n.Value.String())
}
2019-10-21 03:33:41 +09:00
// DirectiveNode type of directive node
2019-10-16 18:21:01 +09:00
type DirectiveNode struct {
Start *token.Token
Value Node
}
2019-10-21 03:33:41 +09:00
// Type returns DirectiveType
func (n *DirectiveNode) Type() NodeType { return DirectiveType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *DirectiveNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String directive to text
2019-10-16 18:21:01 +09:00
func (n *DirectiveNode) String() string {
return fmt.Sprintf("%s%s", n.Start.Value, n.Value.String())
}
2019-10-21 03:33:41 +09:00
// TagNode type of tag node
2019-10-16 18:21:01 +09:00
type TagNode struct {
Start *token.Token
Value Node
}
2019-10-21 03:33:41 +09:00
// Type returns TagType
func (n *TagNode) Type() NodeType { return TagType }
// GetToken returns token instance
2019-10-16 18:21:01 +09:00
func (n *TagNode) GetToken() *token.Token {
return n.Start
}
2019-10-21 03:33:41 +09:00
// String tag to text
2019-10-16 18:21:01 +09:00
func (n *TagNode) String() string {
return fmt.Sprintf("%s %s", n.Start.Value, n.Value.String())
}
2019-10-21 12:53:30 +09:00
// Visitor has Visit method that is invokded for each node encountered by Walk.
2019-10-21 03:33:41 +09:00
// If the result visitor w is not nil, Walk visits each of the children of node with the visitor w,
// followed by a call of w.Visit(nil).
2019-10-16 18:21:01 +09:00
type Visitor interface {
Visit(Node) Visitor
}
2019-10-21 03:33:41 +09:00
// Walk traverses an AST in depth-first order: It starts by calling v.Visit(node); node must not be nil.
// If the visitor w returned by v.Visit(node) is not nil,
// Walk is invoked recursively with visitor w for each of the non-nil children of node,
// followed by a call of w.Visit(nil).
2019-10-16 18:21:01 +09:00
func Walk(v Visitor, node Node) {
if v = v.Visit(node); v == nil {
return
}
switch n := node.(type) {
case *NullNode:
case *IntegerNode:
case *FloatNode:
case *StringNode:
case *MergeKeyNode:
case *BoolNode:
case *InfinityNode:
case *NanNode:
case *FlowMappingNode:
for _, value := range n.Values {
Walk(v, value)
}
case *MappingCollectionNode:
for _, value := range n.Values {
Walk(v, value)
}
case *MappingValueNode:
Walk(v, n.Key)
Walk(v, n.Value)
case *FlowSequenceNode:
for _, value := range n.Values {
Walk(v, value)
}
case *SequenceNode:
for _, value := range n.Values {
Walk(v, value)
}
case *AnchorNode:
Walk(v, n.Name)
Walk(v, n.Value)
case *AliasNode:
Walk(v, n.Value)
}
}