package httpbinding

import (
	
	
	
	
	
	
)

// Headers is used to encode header keys using a provided prefix
type Headers struct {
	header http.Header
	prefix string
}

// AddHeader returns a HeaderValue used to append values to prefix+key
func ( Headers) ( string) HeaderValue {
	return .newHeaderValue(, true)
}

// SetHeader returns a HeaderValue used to set the value of prefix+key
func ( Headers) ( string) HeaderValue {
	return .newHeaderValue(, false)
}

func ( Headers) ( string,  bool) HeaderValue {
	return newHeaderValue(.header, .prefix+strings.TrimSpace(), )
}

// HeaderValue is used to encode values to an HTTP header
type HeaderValue struct {
	header http.Header
	key    string
	append bool
}

func ( http.Header,  string,  bool) HeaderValue {
	return HeaderValue{header: , key: strings.TrimSpace(), append: }
}

func ( HeaderValue) ( string) {
	if .append {
		.header[.key] = append(.header[.key], )
	} else {
		.header[.key] = append(.header[.key][:0], )
	}
}

// String encodes the value v as the header string value
func ( HeaderValue) ( string) {
	.modifyHeader()
}

// Byte encodes the value v as a query string value
func ( HeaderValue) ( int8) {
	.Long(int64())
}

// Short encodes the value v as a query string value
func ( HeaderValue) ( int16) {
	.Long(int64())
}

// Integer encodes the value v as the header string value
func ( HeaderValue) ( int32) {
	.Long(int64())
}

// Long encodes the value v as the header string value
func ( HeaderValue) ( int64) {
	.modifyHeader(strconv.FormatInt(, 10))
}

// Boolean encodes the value v as a query string value
func ( HeaderValue) ( bool) {
	.modifyHeader(strconv.FormatBool())
}

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

// Double encodes the value v as a query string value
func ( HeaderValue) ( float64) {
	.float(, 64)
}

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

// BigInteger encodes the value v as a query string value
func ( HeaderValue) ( *big.Int) {
	.modifyHeader(.String())
}

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

// Blob encodes the value v as a base64 header string value
func ( HeaderValue) ( []byte) {
	 := base64.StdEncoding.EncodeToString()
	.modifyHeader()
}