package gormlite

import (
	
	
)

type parseAllColumnsState int

const (
	parseAllColumnsState_NONE parseAllColumnsState = iota
	parseAllColumnsState_Beginning
	parseAllColumnsState_ReadingRawName
	parseAllColumnsState_ReadingQuotedName
	parseAllColumnsState_EndOfName
	parseAllColumnsState_State_End
)

func parseAllColumns( string) ([]string, error) {
	 := []rune()
	 := make([]string, 0)
	 := parseAllColumnsState_NONE
	 := rune(0)
	 := make([]rune, 0)
	for  := 0;  < len(); ++ {
		switch  {
		case parseAllColumnsState_NONE:
			if [] == '(' {
				 = parseAllColumnsState_Beginning
			}
		case parseAllColumnsState_Beginning:
			if isSpace([]) {
				continue
			}
			if isQuote([]) {
				 = parseAllColumnsState_ReadingQuotedName
				 = []
				continue
			}
			if [] == '[' {
				 = parseAllColumnsState_ReadingQuotedName
				 = ']'
				continue
			} else if [] == ')' {
				return , fmt.Errorf("unexpected token: %s", string([]))
			}
			 = parseAllColumnsState_ReadingRawName
			 = append(, [])
		case parseAllColumnsState_ReadingRawName:
			if isSeparator([]) {
				 = parseAllColumnsState_Beginning
				 = append(, string())
				 = make([]rune, 0)
				continue
			}
			if [] == ')' {
				 = parseAllColumnsState_State_End
				 = append(, string())
			}
			if isQuote([]) {
				return nil, fmt.Errorf("unexpected token: %s", string([]))
			}
			if isSpace([]) {
				 = parseAllColumnsState_EndOfName
				 = append(, string())
				 = make([]rune, 0)
				continue
			}
			 = append(, [])
		case parseAllColumnsState_ReadingQuotedName:
			if [] ==  {
				// check if quote character is escaped
				if +1 < len() && [+1] ==  {
					 = append(, )
					++
					continue
				}
				 = parseAllColumnsState_EndOfName
				 = append(, string())
				 = make([]rune, 0)
				continue
			}
			 = append(, [])
		case parseAllColumnsState_EndOfName:
			if isSpace([]) {
				continue
			}
			if isSeparator([]) {
				 = parseAllColumnsState_Beginning
				continue
			}
			if [] == ')' {
				 = parseAllColumnsState_State_End
				continue
			}
			return nil, fmt.Errorf("unexpected token: %s", string([]))
		case parseAllColumnsState_State_End:
			break
		}
	}
	if  != parseAllColumnsState_State_End {
		return nil, errors.New("unexpected end")
	}
	return , nil
}

func isSpace( rune) bool {
	return  == ' ' ||  == '\t'
}

func isQuote( rune) bool {
	return  == '`' ||  == '"' ||  == '\''
}

func isSeparator( rune) bool {
	return  == ','
}