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: describe_user_scram_credentials_response.go
    path of file: ./repos/plumber/vendor/github.com/Shopify/sarama
    
    the code of the file until where you have to start completion: package sarama

import "time"

type ScramMechanismType int8

const (
	SCRAM_MECHANISM_UNKNOWN ScramMechanismType = iota // 0
	SCRAM_MECHANISM_SHA_256                           // 1
	SCRAM_MECHANISM_SHA_512                           // 2
)

func (s ScramMechanismType) String() string {
	switch s {
	case 1:
		return SASLTypeSCRAMSHA256
	case 2:
		return SASLTypeSCRAMSHA512
	default:
		return "Unknown"
	}
}

type DescribeUserScramCredentialsResponse struct {
	// Version 0 is currently only supported
	Version int16

	ThrottleTime time.Duration

	ErrorCode    KError
	ErrorMessage *string

	Results []*DescribeUserScramCredentialsResult
}

type DescribeUserScramCredentialsResult struct {
	User string

	ErrorCode    KError
	ErrorMessage *string

	CredentialInfos []*UserScramCredentialsResponseInfo
}

type UserScramCredentialsResponseInfo struct {
	Mechanism  ScramMechanismType
	Iterations int32
}

func (r *DescribeUserScramCredentialsResponse) encode(pe packetEncoder) error {
	pe.putInt32(int32(r.ThrottleTime / time.Millisecond))

	pe.putInt16(int16(r.ErrorCode))
	if err := pe.putNullableCompactString(r.ErrorMessage); err != nil {
		return err
	}

	pe.putCompactArrayLength(len(r.Results))
	for _, u := range r.Results {
		if err := pe.putCompactString(u.User); err != nil {
			return err
		}
		pe.putInt16(int16(u.ErrorCode))
		if err := pe.putNullableCompac
    
func (r *DescribeUserScramCredentialsResponse) decode(pd packetDecoder, version int16) error {
	throttleTime, err := pd.getInt32()
	if err != nil {
		return err
	}
	r.ThrottleTime = time.Duration(throttleTime) * time.Millisecond

	kerr, err := pd.getInt16()
	if err != nil {
		return err
	}

	r.ErrorCode = KError(kerr)
	if r.ErrorMessage, err = pd.getCompactNullableString(); err != nil {
		return err
	}

	numUsers, err := pd.getCompactArrayLength()
	if err != nil {
		return err
	}

	if numUsers > 0 {
		r.Results = make([]*DescribeUserScramCredentialsResult, numUsers)
		for i := 0; i < numUsers; i++ {
			r.Results[i] = &DescribeUserScramCredentialsResult{}
			if r.Results[i].User, err = pd.getCompactString(); err != nil {
				return err
			}

			errorCode, err := pd.getInt16()
			if err != nil {
				return err
			}
			r.Results[i].ErrorCode = KError(errorCode)
			if r.Results[i].ErrorMessage, err = pd.getCompactNullableString(); err != nil {
				return err
			}

			numCredentialInfos, err := pd.getCompactArrayLength()
			if err != nil {
				return err
			}

			r.Results[i].CredentialInfos = make([]*UserScramCredentialsResponseInfo, numCredentialInfos)
			for j := 0; j < numCredentialInfos; j++ {
				r.Results[i].CredentialInfos[j] = &UserScramCredentialsResponseInfo{}
				scramMechanism, err := pd.getInt8()
				if err != nil {
					return err
				}
				r.Results[i].CredentialInfos[j].Mechanism = ScramMechanismType(scramMechanism)
				if r.Results[i].CredentialInfos[j].Iterations, err = pd.getInt32(); err != nil {
					return err
				}
				if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
					return err
				}
			}

			if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
				return err
			}
		}
	}

	if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
		return err
	}
	return nil
}