47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package govaluate
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
)
 | 
						|
 | 
						|
/*
 | 
						|
	Holds a series of "transactions" which represent each token as it is output by an outputter (such as ToSQLQuery()).
 | 
						|
	Some outputs (such as SQL) require a function call or non-c-like syntax to represent an expression.
 | 
						|
	To accomplish this, this struct keeps track of each translated token as it is output, and can return and rollback those transactions.
 | 
						|
*/
 | 
						|
type expressionOutputStream struct {
 | 
						|
	transactions []string
 | 
						|
}
 | 
						|
 | 
						|
func (this *expressionOutputStream) add(transaction string) {
 | 
						|
	this.transactions = append(this.transactions, transaction)
 | 
						|
}
 | 
						|
 | 
						|
func (this *expressionOutputStream) rollback() string {
 | 
						|
 | 
						|
	index := len(this.transactions) - 1
 | 
						|
	ret := this.transactions[index]
 | 
						|
 | 
						|
	this.transactions = this.transactions[:index]
 | 
						|
	return ret
 | 
						|
}
 | 
						|
 | 
						|
func (this *expressionOutputStream) createString(delimiter string) string {
 | 
						|
 | 
						|
	var retBuffer bytes.Buffer
 | 
						|
	var transaction string
 | 
						|
 | 
						|
	penultimate := len(this.transactions) - 1
 | 
						|
 | 
						|
	for i := 0; i < penultimate; i++ {
 | 
						|
 | 
						|
		transaction = this.transactions[i]
 | 
						|
 | 
						|
		retBuffer.WriteString(transaction)
 | 
						|
		retBuffer.WriteString(delimiter)
 | 
						|
	}
 | 
						|
	retBuffer.WriteString(this.transactions[penultimate])
 | 
						|
 | 
						|
	return retBuffer.String()
 | 
						|
}
 |