package httpbinding

import (
	
	
	
	
)

// URIValue is used to encode named URI parameters
type URIValue struct {
	path, rawPath, buffer *[]byte

	key string
}

func ( *[]byte,  *[]byte,  *[]byte,  string) URIValue {
	return URIValue{path: , rawPath: , buffer: , key: }
}

func ( URIValue) ( string) ( error) {
	*.path, *.buffer,  = replacePathElement(*.path, *.buffer, .key, , false)
	if  != nil {
		return 
	}
	*.rawPath, *.buffer,  = replacePathElement(*.rawPath, *.buffer, .key, , true)
	return 
}

// Boolean encodes v as a URI string value
func ( URIValue) ( bool) error {
	return .modifyURI(strconv.FormatBool())
}

// String encodes v as a URI string value
func ( URIValue) ( string) error {
	return .modifyURI()
}

// Byte encodes v as a URI string value
func ( URIValue) ( int8) error {
	return .Long(int64())
}

// Short encodes v as a URI string value
func ( URIValue) ( int16) error {
	return .Long(int64())
}

// Integer encodes v as a URI string value
func ( URIValue) ( int32) error {
	return .Long(int64())
}

// Long encodes v as a URI string value
func ( URIValue) ( int64) error {
	return .modifyURI(strconv.FormatInt(, 10))
}

// Float encodes v as a query string value
func ( URIValue) ( float32) error {
	return .float(float64(), 32)
}

// Double encodes v as a query string value
func ( URIValue) ( float64) error {
	return .float(, 64)
}

func ( URIValue) ( float64,  int) error {
	switch {
	case math.IsNaN():
		return .String(floatNaN)
	case math.IsInf(, 1):
		return .String(floatInfinity)
	case math.IsInf(, -1):
		return .String(floatNegInfinity)
	default:
		return .modifyURI(strconv.FormatFloat(, 'f', -1, ))
	}
}

// BigInteger encodes v as a query string value
func ( URIValue) ( *big.Int) error {
	return .modifyURI(.String())
}

// BigDecimal encodes v as a query string value
func ( URIValue) ( *big.Float) error {
	if ,  := .Int64();  == big.Exact {
		return .Long()
	}
	return .modifyURI(.Text('e', -1))
}

// SplitURI parses a Smithy HTTP binding trait URI
func ( string) (,  string) {
	 := strings.IndexRune(, '?')
	if  == -1 {
		 = 
		return , 
	}

	 = [:]
	if +1 >= len() {
		return , 
	}
	 = [+1:]

	return , 
}