package packp

import (
	
	
	
	

	
	
)
Encode writes the UlReq encoding of u to the stream. All the payloads will end with a newline character. Wants and shallows are sorted alphabetically. A depth of 0 means no depth request is sent.
func ( *UploadRequest) ( io.Writer) error {
	 := newUlReqEncoder()
	return .Encode()
}

type ulReqEncoder struct {
	pe   *pktline.Encoder // where to write the encoded data
	data *UploadRequest   // the data to encode
	err  error            // sticky error
}

func ( io.Writer) *ulReqEncoder {
	return &ulReqEncoder{
		pe: pktline.NewEncoder(),
	}
}

func ( *ulReqEncoder) ( *UploadRequest) error {
	.data = 

	if len(.Wants) == 0 {
		return fmt.Errorf("empty wants provided")
	}

	plumbing.HashesSort(.data.Wants)
	for  := .encodeFirstWant;  != nil; {
		 = ()
	}

	return .err
}

func ( *ulReqEncoder) () stateFn {
	var  error
	if .data.Capabilities.IsEmpty() {
		 = .pe.Encodef("want %s\n", .data.Wants[0])
	} else {
		 = .pe.Encodef(
			"want %s %s\n",
			.data.Wants[0],
			.data.Capabilities.String(),
		)
	}

	if  != nil {
		.err = fmt.Errorf("encoding first want line: %s", )
		return nil
	}

	return .encodeAdditionalWants
}

func ( *ulReqEncoder) () stateFn {
	 := .data.Wants[0]
	for ,  := range .data.Wants[1:] {
		if bytes.Equal([:], [:]) {
			continue
		}

		if  := .pe.Encodef("want %s\n", );  != nil {
			.err = fmt.Errorf("encoding want %q: %s", , )
			return nil
		}

		 = 
	}

	return .encodeShallows
}

func ( *ulReqEncoder) () stateFn {
	plumbing.HashesSort(.data.Shallows)

	var  plumbing.Hash
	for ,  := range .data.Shallows {
		if bytes.Equal([:], [:]) {
			continue
		}

		if  := .pe.Encodef("shallow %s\n", );  != nil {
			.err = fmt.Errorf("encoding shallow %q: %s", , )
			return nil
		}

		 = 
	}

	return .encodeDepth
}

func ( *ulReqEncoder) () stateFn {
	switch depth := .data.Depth.(type) {
	case DepthCommits:
		if  != 0 {
			 := int()
			if  := .pe.Encodef("deepen %d\n", );  != nil {
				.err = fmt.Errorf("encoding depth %d: %s", , )
				return nil
			}
		}
	case DepthSince:
		 := time.Time().UTC()
		if  := .pe.Encodef("deepen-since %d\n", .Unix());  != nil {
			.err = fmt.Errorf("encoding depth %s: %s", , )
			return nil
		}
	case DepthReference:
		 := string()
		if  := .pe.Encodef("deepen-not %s\n", );  != nil {
			.err = fmt.Errorf("encoding depth %s: %s", , )
			return nil
		}
	default:
		.err = fmt.Errorf("unsupported depth type")
		return nil
	}

	return .encodeFlush
}

func ( *ulReqEncoder) () stateFn {
	if  := .pe.Flush();  != nil {
		.err = fmt.Errorf("encoding flush-pkt: %s", )
		return nil
	}

	return nil