You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: packet-typing.go
    path of file: ./repos/devspace/vendor/github.com/pkg/sftp
    
    the code of the file until where you have to start completion: package sftp

import (
	"encoding"

	"github.com/pkg/errors"
)

// all incoming packets
type requestPacket interface {
	encoding.BinaryUnmars
    
func makePacket(p rxPacket) (requestPacket, error) {
	var pkt requestPacket
	switch p.pktType {
	case sshFxpInit:
		pkt = &sshFxInitPacket{}
	case sshFxpLstat:
		pkt = &sshFxpLstatPacket{}
	case sshFxpOpen:
		pkt = &sshFxpOpenPacket{}
	case sshFxpClose:
		pkt = &sshFxpClosePacket{}
	case sshFxpRead:
		pkt = &sshFxpReadPacket{}
	case sshFxpWrite:
		pkt = &sshFxpWritePacket{}
	case sshFxpFstat:
		pkt = &sshFxpFstatPacket{}
	case sshFxpSetstat:
		pkt = &sshFxpSetstatPacket{}
	case sshFxpFsetstat:
		pkt = &sshFxpFsetstatPacket{}
	case sshFxpOpendir:
		pkt = &sshFxpOpendirPacket{}
	case sshFxpReaddir:
		pkt = &sshFxpReaddirPacket{}
	case sshFxpRemove:
		pkt = &sshFxpRemovePacket{}
	case sshFxpMkdir:
		pkt = &sshFxpMkdirPacket{}
	case sshFxpRmdir:
		pkt = &sshFxpRmdirPacket{}
	case sshFxpRealpath:
		pkt = &sshFxpRealpathPacket{}
	case sshFxpStat:
		pkt = &sshFxpStatPacket{}
	case sshFxpRename:
		pkt = &sshFxpRenamePacket{}
	case sshFxpReadlink:
		pkt = &sshFxpReadlinkPacket{}
	case sshFxpSymlink:
		pkt = &sshFxpSymlinkPacket{}
	case sshFxpExtended:
		pkt = &sshFxpExtendedPacket{}
	default:
		return nil, errors.Errorf("unhandled packet type: %s", p.pktType)
	}
	if err := pkt.UnmarshalBinary(p.pktBytes); err != nil {
		// Return partially unpacked packet to allow callers to return
		// error messages appropriately with necessary id() method.
		return pkt, err
	}
	return pkt, nil
}