// Code generated by gotdgen, DO NOT EDIT.

package mt

import (
	"context"
	"errors"
	"fmt"
	"sort"
	"strings"

	"go.uber.org/multierr"

	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdjson"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdp"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tgerr"
)

// No-op definition for keeping imports.
var (
	_ = bin.Buffer{}
	_ = context.Background()
	_ = fmt.Stringer(nil)
	_ = strings.Builder{}
	_ = errors.Is
	_ = multierr.AppendInto
	_ = sort.Ints
	_ = tdp.Format
	_ = tgerr.Error{}
	_ = tdjson.Encoder{}
)

// PQInnerData represents TL type `p_q_inner_data#83c95aec`.
type PQInnerData struct {
	// Pq field of PQInnerData.
	Pq []byte
	// P field of PQInnerData.
	P []byte
	// Q field of PQInnerData.
	Q []byte
	// Nonce field of PQInnerData.
	Nonce bin.Int128
	// ServerNonce field of PQInnerData.
	ServerNonce bin.Int128
	// NewNonce field of PQInnerData.
	NewNonce bin.Int256
}

// PQInnerDataTypeID is TL type id of PQInnerData.
const PQInnerDataTypeID = 0x83c95aec

// construct implements constructor of PQInnerDataClass.
func (p PQInnerData) construct() PQInnerDataClass { return &p }

// Ensuring interfaces in compile-time for PQInnerData.
var (
	_ bin.Encoder     = &PQInnerData{}
	_ bin.Decoder     = &PQInnerData{}
	_ bin.BareEncoder = &PQInnerData{}
	_ bin.BareDecoder = &PQInnerData{}

	_ PQInnerDataClass = &PQInnerData{}
)

func (p *PQInnerData) Zero() bool {
	if p == nil {
		return true
	}
	if !(p.Pq == nil) {
		return false
	}
	if !(p.P == nil) {
		return false
	}
	if !(p.Q == nil) {
		return false
	}
	if !(p.Nonce == bin.Int128{}) {
		return false
	}
	if !(p.ServerNonce == bin.Int128{}) {
		return false
	}
	if !(p.NewNonce == bin.Int256{}) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (p *PQInnerData) String() string {
	if p == nil {
		return "PQInnerData(nil)"
	}
	type Alias PQInnerData
	return fmt.Sprintf("PQInnerData%+v", Alias(*p))
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*PQInnerData) TypeID() uint32 {
	return PQInnerDataTypeID
}

// TypeName returns name of type in TL schema.
func (*PQInnerData) TypeName() string {
	return "p_q_inner_data"
}

// TypeInfo returns info about TL type.
func (p *PQInnerData) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "p_q_inner_data",
		ID:   PQInnerDataTypeID,
	}
	if p == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Pq",
			SchemaName: "pq",
		},
		{
			Name:       "P",
			SchemaName: "p",
		},
		{
			Name:       "Q",
			SchemaName: "q",
		},
		{
			Name:       "Nonce",
			SchemaName: "nonce",
		},
		{
			Name:       "ServerNonce",
			SchemaName: "server_nonce",
		},
		{
			Name:       "NewNonce",
			SchemaName: "new_nonce",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (p *PQInnerData) Encode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data#83c95aec as nil")
	}
	b.PutID(PQInnerDataTypeID)
	return p.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (p *PQInnerData) EncodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data#83c95aec as nil")
	}
	b.PutBytes(p.Pq)
	b.PutBytes(p.P)
	b.PutBytes(p.Q)
	b.PutInt128(p.Nonce)
	b.PutInt128(p.ServerNonce)
	b.PutInt256(p.NewNonce)
	return nil
}

// Decode implements bin.Decoder.
func (p *PQInnerData) Decode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data#83c95aec to nil")
	}
	if err := b.ConsumeID(PQInnerDataTypeID); err != nil {
		return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: %w", err)
	}
	return p.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (p *PQInnerData) DecodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data#83c95aec to nil")
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field pq: %w", err)
		}
		p.Pq = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field p: %w", err)
		}
		p.P = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field q: %w", err)
		}
		p.Q = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field nonce: %w", err)
		}
		p.Nonce = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field server_nonce: %w", err)
		}
		p.ServerNonce = value
	}
	{
		value, err := b.Int256()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data#83c95aec: field new_nonce: %w", err)
		}
		p.NewNonce = value
	}
	return nil
}

// GetPq returns value of Pq field.
func (p *PQInnerData) GetPq() (value []byte) {
	if p == nil {
		return
	}
	return p.Pq
}

// GetP returns value of P field.
func (p *PQInnerData) GetP() (value []byte) {
	if p == nil {
		return
	}
	return p.P
}

// GetQ returns value of Q field.
func (p *PQInnerData) GetQ() (value []byte) {
	if p == nil {
		return
	}
	return p.Q
}

// GetNonce returns value of Nonce field.
func (p *PQInnerData) GetNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.Nonce
}

// GetServerNonce returns value of ServerNonce field.
func (p *PQInnerData) GetServerNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.ServerNonce
}

// GetNewNonce returns value of NewNonce field.
func (p *PQInnerData) GetNewNonce() (value bin.Int256) {
	if p == nil {
		return
	}
	return p.NewNonce
}

// PQInnerDataDC represents TL type `p_q_inner_data_dc#a9f55f95`.
type PQInnerDataDC struct {
	// Pq field of PQInnerDataDC.
	Pq []byte
	// P field of PQInnerDataDC.
	P []byte
	// Q field of PQInnerDataDC.
	Q []byte
	// Nonce field of PQInnerDataDC.
	Nonce bin.Int128
	// ServerNonce field of PQInnerDataDC.
	ServerNonce bin.Int128
	// NewNonce field of PQInnerDataDC.
	NewNonce bin.Int256
	// DC field of PQInnerDataDC.
	DC int
}

// PQInnerDataDCTypeID is TL type id of PQInnerDataDC.
const PQInnerDataDCTypeID = 0xa9f55f95

// construct implements constructor of PQInnerDataClass.
func (p PQInnerDataDC) construct() PQInnerDataClass { return &p }

// Ensuring interfaces in compile-time for PQInnerDataDC.
var (
	_ bin.Encoder     = &PQInnerDataDC{}
	_ bin.Decoder     = &PQInnerDataDC{}
	_ bin.BareEncoder = &PQInnerDataDC{}
	_ bin.BareDecoder = &PQInnerDataDC{}

	_ PQInnerDataClass = &PQInnerDataDC{}
)

func (p *PQInnerDataDC) Zero() bool {
	if p == nil {
		return true
	}
	if !(p.Pq == nil) {
		return false
	}
	if !(p.P == nil) {
		return false
	}
	if !(p.Q == nil) {
		return false
	}
	if !(p.Nonce == bin.Int128{}) {
		return false
	}
	if !(p.ServerNonce == bin.Int128{}) {
		return false
	}
	if !(p.NewNonce == bin.Int256{}) {
		return false
	}
	if !(p.DC == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (p *PQInnerDataDC) String() string {
	if p == nil {
		return "PQInnerDataDC(nil)"
	}
	type Alias PQInnerDataDC
	return fmt.Sprintf("PQInnerDataDC%+v", Alias(*p))
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*PQInnerDataDC) TypeID() uint32 {
	return PQInnerDataDCTypeID
}

// TypeName returns name of type in TL schema.
func (*PQInnerDataDC) TypeName() string {
	return "p_q_inner_data_dc"
}

// TypeInfo returns info about TL type.
func (p *PQInnerDataDC) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "p_q_inner_data_dc",
		ID:   PQInnerDataDCTypeID,
	}
	if p == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Pq",
			SchemaName: "pq",
		},
		{
			Name:       "P",
			SchemaName: "p",
		},
		{
			Name:       "Q",
			SchemaName: "q",
		},
		{
			Name:       "Nonce",
			SchemaName: "nonce",
		},
		{
			Name:       "ServerNonce",
			SchemaName: "server_nonce",
		},
		{
			Name:       "NewNonce",
			SchemaName: "new_nonce",
		},
		{
			Name:       "DC",
			SchemaName: "dc",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (p *PQInnerDataDC) Encode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data_dc#a9f55f95 as nil")
	}
	b.PutID(PQInnerDataDCTypeID)
	return p.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (p *PQInnerDataDC) EncodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data_dc#a9f55f95 as nil")
	}
	b.PutBytes(p.Pq)
	b.PutBytes(p.P)
	b.PutBytes(p.Q)
	b.PutInt128(p.Nonce)
	b.PutInt128(p.ServerNonce)
	b.PutInt256(p.NewNonce)
	b.PutInt(p.DC)
	return nil
}

// Decode implements bin.Decoder.
func (p *PQInnerDataDC) Decode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data_dc#a9f55f95 to nil")
	}
	if err := b.ConsumeID(PQInnerDataDCTypeID); err != nil {
		return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: %w", err)
	}
	return p.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (p *PQInnerDataDC) DecodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data_dc#a9f55f95 to nil")
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field pq: %w", err)
		}
		p.Pq = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field p: %w", err)
		}
		p.P = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field q: %w", err)
		}
		p.Q = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field nonce: %w", err)
		}
		p.Nonce = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field server_nonce: %w", err)
		}
		p.ServerNonce = value
	}
	{
		value, err := b.Int256()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field new_nonce: %w", err)
		}
		p.NewNonce = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_dc#a9f55f95: field dc: %w", err)
		}
		p.DC = value
	}
	return nil
}

// GetPq returns value of Pq field.
func (p *PQInnerDataDC) GetPq() (value []byte) {
	if p == nil {
		return
	}
	return p.Pq
}

// GetP returns value of P field.
func (p *PQInnerDataDC) GetP() (value []byte) {
	if p == nil {
		return
	}
	return p.P
}

// GetQ returns value of Q field.
func (p *PQInnerDataDC) GetQ() (value []byte) {
	if p == nil {
		return
	}
	return p.Q
}

// GetNonce returns value of Nonce field.
func (p *PQInnerDataDC) GetNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.Nonce
}

// GetServerNonce returns value of ServerNonce field.
func (p *PQInnerDataDC) GetServerNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.ServerNonce
}

// GetNewNonce returns value of NewNonce field.
func (p *PQInnerDataDC) GetNewNonce() (value bin.Int256) {
	if p == nil {
		return
	}
	return p.NewNonce
}

// GetDC returns value of DC field.
func (p *PQInnerDataDC) GetDC() (value int) {
	if p == nil {
		return
	}
	return p.DC
}

// PQInnerDataTempDC represents TL type `p_q_inner_data_temp_dc#56fddf88`.
type PQInnerDataTempDC struct {
	// Pq field of PQInnerDataTempDC.
	Pq []byte
	// P field of PQInnerDataTempDC.
	P []byte
	// Q field of PQInnerDataTempDC.
	Q []byte
	// Nonce field of PQInnerDataTempDC.
	Nonce bin.Int128
	// ServerNonce field of PQInnerDataTempDC.
	ServerNonce bin.Int128
	// NewNonce field of PQInnerDataTempDC.
	NewNonce bin.Int256
	// DC field of PQInnerDataTempDC.
	DC int
	// ExpiresIn field of PQInnerDataTempDC.
	ExpiresIn int
}

// PQInnerDataTempDCTypeID is TL type id of PQInnerDataTempDC.
const PQInnerDataTempDCTypeID = 0x56fddf88

// construct implements constructor of PQInnerDataClass.
func (p PQInnerDataTempDC) construct() PQInnerDataClass { return &p }

// Ensuring interfaces in compile-time for PQInnerDataTempDC.
var (
	_ bin.Encoder     = &PQInnerDataTempDC{}
	_ bin.Decoder     = &PQInnerDataTempDC{}
	_ bin.BareEncoder = &PQInnerDataTempDC{}
	_ bin.BareDecoder = &PQInnerDataTempDC{}

	_ PQInnerDataClass = &PQInnerDataTempDC{}
)

func (p *PQInnerDataTempDC) Zero() bool {
	if p == nil {
		return true
	}
	if !(p.Pq == nil) {
		return false
	}
	if !(p.P == nil) {
		return false
	}
	if !(p.Q == nil) {
		return false
	}
	if !(p.Nonce == bin.Int128{}) {
		return false
	}
	if !(p.ServerNonce == bin.Int128{}) {
		return false
	}
	if !(p.NewNonce == bin.Int256{}) {
		return false
	}
	if !(p.DC == 0) {
		return false
	}
	if !(p.ExpiresIn == 0) {
		return false
	}

	return true
}

// String implements fmt.Stringer.
func (p *PQInnerDataTempDC) String() string {
	if p == nil {
		return "PQInnerDataTempDC(nil)"
	}
	type Alias PQInnerDataTempDC
	return fmt.Sprintf("PQInnerDataTempDC%+v", Alias(*p))
}

// TypeID returns type id in TL schema.
//
// See https://core.telegram.org/mtproto/TL-tl#remarks.
func (*PQInnerDataTempDC) TypeID() uint32 {
	return PQInnerDataTempDCTypeID
}

// TypeName returns name of type in TL schema.
func (*PQInnerDataTempDC) TypeName() string {
	return "p_q_inner_data_temp_dc"
}

// TypeInfo returns info about TL type.
func (p *PQInnerDataTempDC) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "p_q_inner_data_temp_dc",
		ID:   PQInnerDataTempDCTypeID,
	}
	if p == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Pq",
			SchemaName: "pq",
		},
		{
			Name:       "P",
			SchemaName: "p",
		},
		{
			Name:       "Q",
			SchemaName: "q",
		},
		{
			Name:       "Nonce",
			SchemaName: "nonce",
		},
		{
			Name:       "ServerNonce",
			SchemaName: "server_nonce",
		},
		{
			Name:       "NewNonce",
			SchemaName: "new_nonce",
		},
		{
			Name:       "DC",
			SchemaName: "dc",
		},
		{
			Name:       "ExpiresIn",
			SchemaName: "expires_in",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (p *PQInnerDataTempDC) Encode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data_temp_dc#56fddf88 as nil")
	}
	b.PutID(PQInnerDataTempDCTypeID)
	return p.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (p *PQInnerDataTempDC) EncodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't encode p_q_inner_data_temp_dc#56fddf88 as nil")
	}
	b.PutBytes(p.Pq)
	b.PutBytes(p.P)
	b.PutBytes(p.Q)
	b.PutInt128(p.Nonce)
	b.PutInt128(p.ServerNonce)
	b.PutInt256(p.NewNonce)
	b.PutInt(p.DC)
	b.PutInt(p.ExpiresIn)
	return nil
}

// Decode implements bin.Decoder.
func (p *PQInnerDataTempDC) Decode(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data_temp_dc#56fddf88 to nil")
	}
	if err := b.ConsumeID(PQInnerDataTempDCTypeID); err != nil {
		return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: %w", err)
	}
	return p.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (p *PQInnerDataTempDC) DecodeBare(b *bin.Buffer) error {
	if p == nil {
		return fmt.Errorf("can't decode p_q_inner_data_temp_dc#56fddf88 to nil")
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field pq: %w", err)
		}
		p.Pq = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field p: %w", err)
		}
		p.P = value
	}
	{
		value, err := b.Bytes()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field q: %w", err)
		}
		p.Q = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field nonce: %w", err)
		}
		p.Nonce = value
	}
	{
		value, err := b.Int128()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field server_nonce: %w", err)
		}
		p.ServerNonce = value
	}
	{
		value, err := b.Int256()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field new_nonce: %w", err)
		}
		p.NewNonce = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field dc: %w", err)
		}
		p.DC = value
	}
	{
		value, err := b.Int()
		if err != nil {
			return fmt.Errorf("unable to decode p_q_inner_data_temp_dc#56fddf88: field expires_in: %w", err)
		}
		p.ExpiresIn = value
	}
	return nil
}

// GetPq returns value of Pq field.
func (p *PQInnerDataTempDC) GetPq() (value []byte) {
	if p == nil {
		return
	}
	return p.Pq
}

// GetP returns value of P field.
func (p *PQInnerDataTempDC) GetP() (value []byte) {
	if p == nil {
		return
	}
	return p.P
}

// GetQ returns value of Q field.
func (p *PQInnerDataTempDC) GetQ() (value []byte) {
	if p == nil {
		return
	}
	return p.Q
}

// GetNonce returns value of Nonce field.
func (p *PQInnerDataTempDC) GetNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.Nonce
}

// GetServerNonce returns value of ServerNonce field.
func (p *PQInnerDataTempDC) GetServerNonce() (value bin.Int128) {
	if p == nil {
		return
	}
	return p.ServerNonce
}

// GetNewNonce returns value of NewNonce field.
func (p *PQInnerDataTempDC) GetNewNonce() (value bin.Int256) {
	if p == nil {
		return
	}
	return p.NewNonce
}

// GetDC returns value of DC field.
func (p *PQInnerDataTempDC) GetDC() (value int) {
	if p == nil {
		return
	}
	return p.DC
}

// GetExpiresIn returns value of ExpiresIn field.
func (p *PQInnerDataTempDC) GetExpiresIn() (value int) {
	if p == nil {
		return
	}
	return p.ExpiresIn
}

// PQInnerDataClassName is schema name of PQInnerDataClass.
const PQInnerDataClassName = "P_Q_inner_data"

// PQInnerDataClass represents P_Q_inner_data generic type.
//
// Example:
//
//	g, err := mt.DecodePQInnerData(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *mt.PQInnerData: // p_q_inner_data#83c95aec
//	case *mt.PQInnerDataDC: // p_q_inner_data_dc#a9f55f95
//	case *mt.PQInnerDataTempDC: // p_q_inner_data_temp_dc#56fddf88
//	default: panic(v)
//	}
type PQInnerDataClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() PQInnerDataClass

	// TypeID returns type id in TL schema.
	//
	// See https://core.telegram.org/mtproto/TL-tl#remarks.
	TypeID() uint32
	// TypeName returns name of type in TL schema.
	TypeName() string
	// String implements fmt.Stringer.
	String() string
	// Zero returns true if current object has a zero value.
	Zero() bool

	// Pq field of PQInnerData.
	GetPq() (value []byte)
	// P field of PQInnerData.
	GetP() (value []byte)
	// Q field of PQInnerData.
	GetQ() (value []byte)
	// Nonce field of PQInnerData.
	GetNonce() (value bin.Int128)
	// ServerNonce field of PQInnerData.
	GetServerNonce() (value bin.Int128)
	// NewNonce field of PQInnerData.
	GetNewNonce() (value bin.Int256)
}

// DecodePQInnerData implements binary de-serialization for PQInnerDataClass.
func DecodePQInnerData(buf *bin.Buffer) (PQInnerDataClass, error) {
	id, err := buf.PeekID()
	if err != nil {
		return nil, err
	}
	switch id {
	case PQInnerDataTypeID:
		// Decoding p_q_inner_data#83c95aec.
		v := PQInnerData{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode PQInnerDataClass: %w", err)
		}
		return &v, nil
	case PQInnerDataDCTypeID:
		// Decoding p_q_inner_data_dc#a9f55f95.
		v := PQInnerDataDC{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode PQInnerDataClass: %w", err)
		}
		return &v, nil
	case PQInnerDataTempDCTypeID:
		// Decoding p_q_inner_data_temp_dc#56fddf88.
		v := PQInnerDataTempDC{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode PQInnerDataClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode PQInnerDataClass: %w", bin.NewUnexpectedID(id))
	}
}

// PQInnerData boxes the PQInnerDataClass providing a helper.
type PQInnerDataBox struct {
	P_Q_inner_data PQInnerDataClass
}

// Decode implements bin.Decoder for PQInnerDataBox.
func (b *PQInnerDataBox) Decode(buf *bin.Buffer) error {
	if b == nil {
		return fmt.Errorf("unable to decode PQInnerDataBox to nil")
	}
	v, err := DecodePQInnerData(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.P_Q_inner_data = v
	return nil
}

// Encode implements bin.Encode for PQInnerDataBox.
func (b *PQInnerDataBox) Encode(buf *bin.Buffer) error {
	if b == nil || b.P_Q_inner_data == nil {
		return fmt.Errorf("unable to encode PQInnerDataClass as nil")
	}
	return b.P_Q_inner_data.Encode(buf)
}
