// Code generated by go run gob_gen.go; DO NOT EDIT.

package java

import (
	"bytes"
	"github.com/google/blueprint/gobtools"
)

func init() {
	ProguardSpecInfoGobRegId = gobtools.RegisterType(func() gobtools.CustomDec { return new(ProguardSpecInfo) })
}

func (r ProguardSpecInfo) Encode(ctx gobtools.EncContext, buf *bytes.Buffer) error {
	var err error

	if err = gobtools.EncodeSimple(buf, r.Export_proguard_flags_files); err != nil {
		return err
	}

	if err = r.ProguardFlagsFiles.EncodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.UnconditionallyExportedProguardFlags.EncodeInterface(ctx, buf); err != nil {
		return err
	}
	return err
}

func (r *ProguardSpecInfo) Decode(ctx gobtools.EncContext, buf *bytes.Reader) error {
	var err error

	err = gobtools.DecodeSimple[bool](buf, &r.Export_proguard_flags_files)
	if err != nil {
		return err
	}

	if err = r.ProguardFlagsFiles.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	if err = r.UnconditionallyExportedProguardFlags.DecodeInterface(ctx, buf); err != nil {
		return err
	}

	return err
}

var ProguardSpecInfoGobRegId int16

func (r ProguardSpecInfo) GetTypeId() int16 {
	return ProguardSpecInfoGobRegId
}
