package wire

import (
	

	
	
	
)

// A ResetStreamFrame is a RESET_STREAM or RESET_STREAM_AT frame in QUIC
type ResetStreamFrame struct {
	StreamID     protocol.StreamID
	ErrorCode    qerr.StreamErrorCode
	FinalSize    protocol.ByteCount
	ReliableSize protocol.ByteCount
}

func parseResetStreamFrame( []byte,  bool,  protocol.Version) (*ResetStreamFrame, int, error) {
	 := len()
	, ,  := quicvarint.Parse()
	if  != nil {
		return nil, 0, replaceUnexpectedEOF()
	}
	 = [:]
	, ,  := quicvarint.Parse()
	if  != nil {
		return nil, 0, replaceUnexpectedEOF()
	}
	 = [:]
	, ,  := quicvarint.Parse()
	if  != nil {
		return nil, 0, replaceUnexpectedEOF()
	}
	 = [:]

	var  uint64
	if  {
		, ,  = quicvarint.Parse()
		if  != nil {
			return nil, 0, replaceUnexpectedEOF()
		}
		 = [:]
	}
	if  >  {
		return nil, 0, fmt.Errorf("RESET_STREAM_AT: reliable size can't be larger than final size (%d vs %d)", , )
	}

	return &ResetStreamFrame{
		StreamID:     protocol.StreamID(),
		ErrorCode:    qerr.StreamErrorCode(),
		FinalSize:    protocol.ByteCount(),
		ReliableSize: protocol.ByteCount(),
	},  - len(), nil
}

func ( *ResetStreamFrame) ( []byte,  protocol.Version) ([]byte, error) {
	if .ReliableSize == 0 {
		 = quicvarint.Append(, uint64(FrameTypeResetStream))
	} else {
		 = quicvarint.Append(, uint64(FrameTypeResetStreamAt))
	}
	 = quicvarint.Append(, uint64(.StreamID))
	 = quicvarint.Append(, uint64(.ErrorCode))
	 = quicvarint.Append(, uint64(.FinalSize))
	if .ReliableSize > 0 {
		 = quicvarint.Append(, uint64(.ReliableSize))
	}
	return , nil
}

// Length of a written frame
func ( *ResetStreamFrame) (protocol.Version) protocol.ByteCount {
	 := 1 // the frame type for both RESET_STREAM and RESET_STREAM_AT fits into 1 byte
	if .ReliableSize > 0 {
		 += quicvarint.Len(uint64(.ReliableSize))
	}
	return protocol.ByteCount( + quicvarint.Len(uint64(.StreamID)) + quicvarint.Len(uint64(.ErrorCode)) + quicvarint.Len(uint64(.FinalSize)))
}