package proto

import (
	
	
	
	
	

	
)

type writer interface {
	io.Writer
io.StringWriter
	WriteString(s string) (n int, err error)
}

type Writer struct {
	writer

	lenBuf []byte
	numBuf []byte
}

func ( writer) *Writer {
	return &Writer{
		writer: ,

		lenBuf: make([]byte, 64),
		numBuf: make([]byte, 64),
	}
}

func ( *Writer) ( []interface{}) error {
	if  := .WriteByte(ArrayReply);  != nil {
		return 
	}

	if  := .writeLen(len());  != nil {
		return 
	}

	for ,  := range  {
		if  := .WriteArg();  != nil {
			return 
		}
	}

	return nil
}

func ( *Writer) ( int) error {
	.lenBuf = strconv.AppendUint(.lenBuf[:0], uint64(), 10)
	.lenBuf = append(.lenBuf, '\r', '\n')
	,  := .Write(.lenBuf)
	return 
}

func ( *Writer) ( interface{}) error {
	switch v := .(type) {
	case nil:
		return .string("")
	case string:
		return .string()
	case []byte:
		return .bytes()
	case int:
		return .int(int64())
	case int8:
		return .int(int64())
	case int16:
		return .int(int64())
	case int32:
		return .int(int64())
	case int64:
		return .int()
	case uint:
		return .uint(uint64())
	case uint8:
		return .uint(uint64())
	case uint16:
		return .uint(uint64())
	case uint32:
		return .uint(uint64())
	case uint64:
		return .uint()
	case float32:
		return .float(float64())
	case float64:
		return .float()
	case bool:
		if  {
			return .int(1)
		}
		return .int(0)
	case time.Time:
		.numBuf = .AppendFormat(.numBuf[:0], time.RFC3339Nano)
		return .bytes(.numBuf)
	case encoding.BinaryMarshaler:
		,  := .MarshalBinary()
		if  != nil {
			return 
		}
		return .bytes()
	default:
		return fmt.Errorf(
			"redis: can't marshal %T (implement encoding.BinaryMarshaler)", )
	}
}

func ( *Writer) ( []byte) error {
	if  := .WriteByte(StringReply);  != nil {
		return 
	}

	if  := .writeLen(len());  != nil {
		return 
	}

	if ,  := .Write();  != nil {
		return 
	}

	return .crlf()
}

func ( *Writer) ( string) error {
	return .bytes(util.StringToBytes())
}

func ( *Writer) ( uint64) error {
	.numBuf = strconv.AppendUint(.numBuf[:0], , 10)
	return .bytes(.numBuf)
}

func ( *Writer) ( int64) error {
	.numBuf = strconv.AppendInt(.numBuf[:0], , 10)
	return .bytes(.numBuf)
}

func ( *Writer) ( float64) error {
	.numBuf = strconv.AppendFloat(.numBuf[:0], , 'f', -1, 64)
	return .bytes(.numBuf)
}

func ( *Writer) () error {
	if  := .WriteByte('\r');  != nil {
		return 
	}
	return .WriteByte('\n')