a3d46d52a8
test / release-check (push) Has been skipped
test / 1.25/macos-14 (push) Has been cancelled
test / 1.25/macos-latest (push) Has been cancelled
test / 1.25/ubuntu-latest (push) Has been cancelled
test / 1.25/windows-latest (push) Has been cancelled
test / 1.26/macos-14 (push) Has been cancelled
test / 1.26/macos-latest (push) Has been cancelled
test / 1.26/ubuntu-latest (push) Has been cancelled
test / 1.26/windows-latest (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
49 lines
1004 B
Go
49 lines
1004 B
Go
package tracker
|
|
|
|
import "git.ostiwe.com/ostiwe/go-toml/v2/unstable"
|
|
|
|
// KeyTracker is a tracker that keeps track of the current Key as the AST is
|
|
// walked.
|
|
type KeyTracker struct {
|
|
k []string
|
|
}
|
|
|
|
// UpdateTable sets the state of the tracker with the AST table node.
|
|
func (t *KeyTracker) UpdateTable(node *unstable.Node) {
|
|
t.reset()
|
|
t.Push(node)
|
|
}
|
|
|
|
// UpdateArrayTable sets the state of the tracker with the AST array table node.
|
|
func (t *KeyTracker) UpdateArrayTable(node *unstable.Node) {
|
|
t.reset()
|
|
t.Push(node)
|
|
}
|
|
|
|
// Push the given key on the stack.
|
|
func (t *KeyTracker) Push(node *unstable.Node) {
|
|
it := node.Key()
|
|
for it.Next() {
|
|
t.k = append(t.k, string(it.Node().Data))
|
|
}
|
|
}
|
|
|
|
// Pop key from stack.
|
|
func (t *KeyTracker) Pop(node *unstable.Node) {
|
|
it := node.Key()
|
|
for it.Next() {
|
|
t.k = t.k[:len(t.k)-1]
|
|
}
|
|
}
|
|
|
|
// Key returns the current key.
|
|
func (t *KeyTracker) Key() []string {
|
|
k := make([]string, len(t.k))
|
|
copy(k, t.k)
|
|
return k
|
|
}
|
|
|
|
func (t *KeyTracker) reset() {
|
|
t.k = t.k[:0]
|
|
}
|