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()
 | |
| }
 |