...

Source file src/github.com/pelletier/go-toml/v2/unstable/ast.go

Documentation: github.com/pelletier/go-toml/v2/unstable

     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  

View as plain text