podman

Форк
0
136 строк · 3.6 Кб
1
package unstable
2

3
import (
4
	"fmt"
5
	"unsafe"
6

7
	"github.com/pelletier/go-toml/v2/internal/danger"
8
)
9

10
// Iterator over a sequence of nodes.
11
//
12
// Starts uninitialized, you need to call Next() first.
13
//
14
// For example:
15
//
16
//	it := n.Children()
17
//	for it.Next() {
18
//		n := it.Node()
19
//		// do something with n
20
//	}
21
type Iterator struct {
22
	started bool
23
	node    *Node
24
}
25

26
// Next moves the iterator forward and returns true if points to a
27
// node, false otherwise.
28
func (c *Iterator) Next() bool {
29
	if !c.started {
30
		c.started = true
31
	} else if c.node.Valid() {
32
		c.node = c.node.Next()
33
	}
34
	return c.node.Valid()
35
}
36

37
// IsLast returns true if the current node of the iterator is the last
38
// one.  Subsequent calls to Next() will return false.
39
func (c *Iterator) IsLast() bool {
40
	return c.node.next == 0
41
}
42

43
// Node returns a pointer to the node pointed at by the iterator.
44
func (c *Iterator) Node() *Node {
45
	return c.node
46
}
47

48
// Node in a TOML expression AST.
49
//
50
// Depending on Kind, its sequence of children should be interpreted
51
// differently.
52
//
53
//   - Array have one child per element in the array.
54
//   - InlineTable have one child per key-value in the table (each of kind
55
//     InlineTable).
56
//   - KeyValue have at least two children. The first one is the value. The rest
57
//     make a potentially dotted key.
58
//   - Table and ArrayTable's children represent a dotted key (same as
59
//     KeyValue, but without the first node being the value).
60
//
61
// When relevant, Raw describes the range of bytes this node is referring to in
62
// the input document. Use Parser.Raw() to retrieve the actual bytes.
63
type Node struct {
64
	Kind Kind
65
	Raw  Range  // Raw bytes from the input.
66
	Data []byte // Node value (either allocated or referencing the input).
67

68
	// References to other nodes, as offsets in the backing array
69
	// from this node. References can go backward, so those can be
70
	// negative.
71
	next  int // 0 if last element
72
	child int // 0 if no child
73
}
74

75
// Range of bytes in the document.
76
type Range struct {
77
	Offset uint32
78
	Length uint32
79
}
80

81
// Next returns a pointer to the next node, or nil if there is no next node.
82
func (n *Node) Next() *Node {
83
	if n.next == 0 {
84
		return nil
85
	}
86
	ptr := unsafe.Pointer(n)
87
	size := unsafe.Sizeof(Node{})
88
	return (*Node)(danger.Stride(ptr, size, n.next))
89
}
90

91
// Child returns a pointer to the first child node of this node. Other children
92
// can be accessed calling Next on the first child.  Returns an nil if this Node
93
// has no child.
94
func (n *Node) Child() *Node {
95
	if n.child == 0 {
96
		return nil
97
	}
98
	ptr := unsafe.Pointer(n)
99
	size := unsafe.Sizeof(Node{})
100
	return (*Node)(danger.Stride(ptr, size, n.child))
101
}
102

103
// Valid returns true if the node's kind is set (not to Invalid).
104
func (n *Node) Valid() bool {
105
	return n != nil
106
}
107

108
// Key returns the children nodes making the Key on a supported node. Panics
109
// otherwise.  They are guaranteed to be all be of the Kind Key. A simple key
110
// would return just one element.
111
func (n *Node) Key() Iterator {
112
	switch n.Kind {
113
	case KeyValue:
114
		value := n.Child()
115
		if !value.Valid() {
116
			panic(fmt.Errorf("KeyValue should have at least two children"))
117
		}
118
		return Iterator{node: value.Next()}
119
	case Table, ArrayTable:
120
		return Iterator{node: n.Child()}
121
	default:
122
		panic(fmt.Errorf("Key() is not supported on a %s", n.Kind))
123
	}
124
}
125

126
// Value returns a pointer to the value node of a KeyValue.
127
// Guaranteed to be non-nil.  Panics if not called on a KeyValue node,
128
// or if the Children are malformed.
129
func (n *Node) Value() *Node {
130
	return n.Child()
131
}
132

133
// Children returns an iterator over a node's children.
134
func (n *Node) Children() Iterator {
135
	return Iterator{node: n.Child()}
136
}
137

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.