package types

import (
	
	
	
	
	

	
)

func ( []byte,  interface{},  int) []byte {
	switch v := .(type) {
	case nil:
		return AppendNull(, )
	case bool:
		return appendBool(, )
	case int32:
		return strconv.AppendInt(, int64(), 10)
	case int64:
		return strconv.AppendInt(, , 10)
	case int:
		return strconv.AppendInt(, int64(), 10)
	case float32:
		return appendFloat(, float64(), , 32)
	case float64:
		return appendFloat(, , , 64)
	case string:
		return AppendString(, , )
	case time.Time:
		return AppendTime(, , )
	case []byte:
		return AppendBytes(, , )
	case ValueAppender:
		return appendAppender(, , )
	default:
		return appendValue(, reflect.ValueOf(), )
	}
}

func ( []byte,  error) []byte {
	 = append(, "?!("...)
	 = append(, .Error()...)
	 = append(, ')')
	return 
}

func ( []byte,  int) []byte {
	if hasFlag(, quoteFlag) {
		return append(, "NULL"...)
	}
	return nil
}

func ( []byte,  bool) []byte {
	if  {
		return append(, "TRUE"...)
	}
	return append(, "FALSE"...)
}

func ( []byte,  float64,  int,  int) []byte {
	if hasFlag(, arrayFlag) {
		return appendFloat2(, , )
	}

	switch {
	case math.IsNaN():
		if hasFlag(, quoteFlag) {
			return append(, "'NaN'"...)
		}
		return append(, "NaN"...)
	case math.IsInf(, 1):
		if hasFlag(, quoteFlag) {
			return append(, "'Infinity'"...)
		}
		return append(, "Infinity"...)
	case math.IsInf(, -1):
		if hasFlag(, quoteFlag) {
			return append(, "'-Infinity'"...)
		}
		return append(, "-Infinity"...)
	default:
		return strconv.AppendFloat(, , 'f', -1, )
	}
}

func ( []byte,  float64,  int) []byte {
	switch {
	case math.IsNaN():
		return append(, "NaN"...)
	case math.IsInf(, 1):
		return append(, "Infinity"...)
	case math.IsInf(, -1):
		return append(, "-Infinity"...)
	default:
		return strconv.AppendFloat(, , 'f', -1, 64)
	}
}

func ( []byte,  string,  int) []byte {
	if hasFlag(, arrayFlag) {
		return appendString2(, , )
	}

	if hasFlag(, quoteFlag) {
		 = append(, '\'')
		for ,  := range  {
			if  == '\000' {
				continue
			}

			if  == '\'' {
				 = append(, '\'', '\'')
			} else {
				 = appendRune(, )
			}
		}
		 = append(, '\'')
		return 
	}

	for ,  := range  {
		if  != '\000' {
			 = appendRune(, )
		}
	}
	return 
}

func ( []byte,  string,  int) []byte {
	 = append(, '"')
	for ,  := range  {
		if  == '\000' {
			continue
		}

		switch  {
		case '\'':
			if hasFlag(, quoteFlag) {
				 = append(, '\'')
			}
			 = append(, '\'')
		case '"':
			 = append(, '\\', '"')
		case '\\':
			 = append(, '\\', '\\')
		default:
			 = appendRune(, )
		}
	}
	 = append(, '"')
	return 
}

func ( []byte,  rune) []byte {
	if  < utf8.RuneSelf {
		return append(, byte())
	}
	 := len()
	if cap()- < utf8.UTFMax {
		 = append(, make([]byte, utf8.UTFMax)...)
	}
	 := utf8.EncodeRune([:+utf8.UTFMax], )
	return [:+]
}

func ( []byte,  []byte,  int) []byte {
	if  == nil {
		return AppendNull(, )
	}

	if hasFlag(, arrayFlag) {
		 = append(, `"\`...)
	} else if hasFlag(, quoteFlag) {
		 = append(, '\'')
	}

	 = append(, `\x`...)

	 := len()
	 = append(, make([]byte, hex.EncodedLen(len()))...)
	hex.Encode([:], )

	if hasFlag(, arrayFlag) {
		 = append(, '"')
	} else if hasFlag(, quoteFlag) {
		 = append(, '\'')
	}

	return 
}

func ( []byte,  ValueAppender,  int) []byte {
	,  := .AppendValue(, )
	if  != nil {
		return AppendError(, )
	}
	return 
}