github.com/aavshr/aws-sdk-go@v1.41.3/internal/ini/parse_stack.go (about)

     1  package ini
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  // ParseStack is a stack that contains a container, the stack portion,
     9  // and the list which is the list of ASTs that have been successfully
    10  // parsed.
    11  type ParseStack struct {
    12  	top       int
    13  	container []AST
    14  	list      []AST
    15  	index     int
    16  }
    17  
    18  func newParseStack(sizeContainer, sizeList int) ParseStack {
    19  	return ParseStack{
    20  		container: make([]AST, sizeContainer),
    21  		list:      make([]AST, sizeList),
    22  	}
    23  }
    24  
    25  // Pop will return and truncate the last container element.
    26  func (s *ParseStack) Pop() AST {
    27  	s.top--
    28  	return s.container[s.top]
    29  }
    30  
    31  // Push will add the new AST to the container
    32  func (s *ParseStack) Push(ast AST) {
    33  	s.container[s.top] = ast
    34  	s.top++
    35  }
    36  
    37  // MarkComplete will append the AST to the list of completed statements
    38  func (s *ParseStack) MarkComplete(ast AST) {
    39  	s.list[s.index] = ast
    40  	s.index++
    41  }
    42  
    43  // List will return the completed statements
    44  func (s ParseStack) List() []AST {
    45  	return s.list[:s.index]
    46  }
    47  
    48  // Len will return the length of the container
    49  func (s *ParseStack) Len() int {
    50  	return s.top
    51  }
    52  
    53  func (s ParseStack) String() string {
    54  	buf := bytes.Buffer{}
    55  	for i, node := range s.list {
    56  		buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node))
    57  	}
    58  
    59  	return buf.String()
    60  }