////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by codergen
////////////////////////////////////////////////////////////////////////////////

package rpc

import (
	"android.googlesource.com/platform/tools/gpu/binary"
	"android.googlesource.com/platform/tools/gpu/binary/registry"
	"android.googlesource.com/platform/tools/gpu/binary/schema"
)

var Namespace = registry.NewNamespace()

func init() {
	registry.Global.AddFallbacks(Namespace)
	Namespace.Add((*Error)(nil).Class())
}

var (
	binaryIDError = binary.ID{0xfe, 0x76, 0xe0, 0x3a, 0x44, 0xa3, 0xc0, 0x38, 0xdb, 0x62, 0x2e, 0xe3, 0xf3, 0xe4, 0xf9, 0x87, 0xf9, 0x19, 0xbe, 0xfd}
)

type binaryClassError struct{}

func (*Error) Class() binary.Class {
	return (*binaryClassError)(nil)
}
func doEncodeError(e binary.Encoder, o *Error) error {
	if err := e.String(o.message); err != nil {
		return err
	}
	return nil
}
func doDecodeError(d binary.Decoder, o *Error) error {
	if obj, err := d.String(); err != nil {
		return err
	} else {
		o.message = string(obj)
	}
	return nil
}
func doSkipError(d binary.Decoder) error {
	if err := d.SkipString(); err != nil {
		return err
	}
	return nil
}
func (*binaryClassError) ID() binary.ID      { return binaryIDError }
func (*binaryClassError) New() binary.Object { return &Error{} }
func (*binaryClassError) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodeError(e, obj.(*Error))
}
func (*binaryClassError) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &Error{}
	return obj, doDecodeError(d, obj)
}
func (*binaryClassError) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodeError(d, obj.(*Error))
}
func (*binaryClassError) Skip(d binary.Decoder) error { return doSkipError(d) }
func (*binaryClassError) Schema() *schema.Class       { return schemaError }

var schemaError = &schema.Class{
	TypeID:  binaryIDError,
	Package: "rpc",
	Name:    "Error",
	Fields: []schema.Field{
		{Declared: "message", Type: &schema.Primitive{Name: "string", Method: schema.String}},
	},
}
