// Code generated by gotdgen, DO NOT EDIT.

package tdapi

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{}
)

// SuggestedActionEnableArchiveAndMuteNewChats represents TL type `suggestedActionEnableArchiveAndMuteNewChats#7841ec4f`.
type SuggestedActionEnableArchiveAndMuteNewChats struct {
}

// SuggestedActionEnableArchiveAndMuteNewChatsTypeID is TL type id of SuggestedActionEnableArchiveAndMuteNewChats.
const SuggestedActionEnableArchiveAndMuteNewChatsTypeID = 0x7841ec4f

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionEnableArchiveAndMuteNewChats) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionEnableArchiveAndMuteNewChats{}
)

func (s *SuggestedActionEnableArchiveAndMuteNewChats) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionEnableArchiveAndMuteNewChats",
		ID:   SuggestedActionEnableArchiveAndMuteNewChatsTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f as nil")
	}
	b.PutID(SuggestedActionEnableArchiveAndMuteNewChatsTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f to nil")
	}
	if err := b.ConsumeID(SuggestedActionEnableArchiveAndMuteNewChatsTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionEnableArchiveAndMuteNewChats")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionEnableArchiveAndMuteNewChats) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionEnableArchiveAndMuteNewChats"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionEnableArchiveAndMuteNewChats#7841ec4f: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionCheckPassword represents TL type `suggestedActionCheckPassword#71e072b7`.
type SuggestedActionCheckPassword struct {
}

// SuggestedActionCheckPasswordTypeID is TL type id of SuggestedActionCheckPassword.
const SuggestedActionCheckPasswordTypeID = 0x71e072b7

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionCheckPassword) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionCheckPassword{}
)

func (s *SuggestedActionCheckPassword) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionCheckPassword) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionCheckPassword",
		ID:   SuggestedActionCheckPasswordTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionCheckPassword) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPassword#71e072b7 as nil")
	}
	b.PutID(SuggestedActionCheckPasswordTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionCheckPassword) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPassword#71e072b7 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionCheckPassword) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPassword#71e072b7 to nil")
	}
	if err := b.ConsumeID(SuggestedActionCheckPasswordTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionCheckPassword#71e072b7: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionCheckPassword) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPassword#71e072b7 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionCheckPassword) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPassword#71e072b7 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionCheckPassword")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionCheckPassword) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPassword#71e072b7 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionCheckPassword"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionCheckPassword#71e072b7: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionCheckPhoneNumber represents TL type `suggestedActionCheckPhoneNumber#26ab77eb`.
type SuggestedActionCheckPhoneNumber struct {
}

// SuggestedActionCheckPhoneNumberTypeID is TL type id of SuggestedActionCheckPhoneNumber.
const SuggestedActionCheckPhoneNumberTypeID = 0x26ab77eb

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionCheckPhoneNumber) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionCheckPhoneNumber{}
)

func (s *SuggestedActionCheckPhoneNumber) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionCheckPhoneNumber) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionCheckPhoneNumber",
		ID:   SuggestedActionCheckPhoneNumberTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionCheckPhoneNumber) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPhoneNumber#26ab77eb as nil")
	}
	b.PutID(SuggestedActionCheckPhoneNumberTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionCheckPhoneNumber) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPhoneNumber#26ab77eb as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionCheckPhoneNumber) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPhoneNumber#26ab77eb to nil")
	}
	if err := b.ConsumeID(SuggestedActionCheckPhoneNumberTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionCheckPhoneNumber#26ab77eb: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionCheckPhoneNumber) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPhoneNumber#26ab77eb to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionCheckPhoneNumber) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCheckPhoneNumber#26ab77eb as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionCheckPhoneNumber")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionCheckPhoneNumber) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCheckPhoneNumber#26ab77eb to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionCheckPhoneNumber"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionCheckPhoneNumber#26ab77eb: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionViewChecksHint represents TL type `suggestedActionViewChecksHint#35203547`.
type SuggestedActionViewChecksHint struct {
}

// SuggestedActionViewChecksHintTypeID is TL type id of SuggestedActionViewChecksHint.
const SuggestedActionViewChecksHintTypeID = 0x35203547

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionViewChecksHint) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionViewChecksHint{}
)

func (s *SuggestedActionViewChecksHint) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionViewChecksHint) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionViewChecksHint",
		ID:   SuggestedActionViewChecksHintTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionViewChecksHint) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionViewChecksHint#35203547 as nil")
	}
	b.PutID(SuggestedActionViewChecksHintTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionViewChecksHint) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionViewChecksHint#35203547 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionViewChecksHint) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionViewChecksHint#35203547 to nil")
	}
	if err := b.ConsumeID(SuggestedActionViewChecksHintTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionViewChecksHint#35203547: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionViewChecksHint) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionViewChecksHint#35203547 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionViewChecksHint) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionViewChecksHint#35203547 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionViewChecksHint")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionViewChecksHint) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionViewChecksHint#35203547 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionViewChecksHint"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionViewChecksHint#35203547: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionConvertToBroadcastGroup represents TL type `suggestedActionConvertToBroadcastGroup#c67a2e38`.
type SuggestedActionConvertToBroadcastGroup struct {
	// Supergroup identifier
	SupergroupID int64
}

// SuggestedActionConvertToBroadcastGroupTypeID is TL type id of SuggestedActionConvertToBroadcastGroup.
const SuggestedActionConvertToBroadcastGroupTypeID = 0xc67a2e38

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionConvertToBroadcastGroup) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionConvertToBroadcastGroup{}
)

func (s *SuggestedActionConvertToBroadcastGroup) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.SupergroupID == 0) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionConvertToBroadcastGroup) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionConvertToBroadcastGroup",
		ID:   SuggestedActionConvertToBroadcastGroupTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "SupergroupID",
			SchemaName: "supergroup_id",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionConvertToBroadcastGroup) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionConvertToBroadcastGroup#c67a2e38 as nil")
	}
	b.PutID(SuggestedActionConvertToBroadcastGroupTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionConvertToBroadcastGroup) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionConvertToBroadcastGroup#c67a2e38 as nil")
	}
	b.PutInt53(s.SupergroupID)
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionConvertToBroadcastGroup) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionConvertToBroadcastGroup#c67a2e38 to nil")
	}
	if err := b.ConsumeID(SuggestedActionConvertToBroadcastGroupTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionConvertToBroadcastGroup#c67a2e38: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionConvertToBroadcastGroup) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionConvertToBroadcastGroup#c67a2e38 to nil")
	}
	{
		value, err := b.Int53()
		if err != nil {
			return fmt.Errorf("unable to decode suggestedActionConvertToBroadcastGroup#c67a2e38: field supergroup_id: %w", err)
		}
		s.SupergroupID = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionConvertToBroadcastGroup) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionConvertToBroadcastGroup#c67a2e38 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionConvertToBroadcastGroup")
	b.Comma()
	b.FieldStart("supergroup_id")
	b.PutInt53(s.SupergroupID)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionConvertToBroadcastGroup) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionConvertToBroadcastGroup#c67a2e38 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionConvertToBroadcastGroup"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionConvertToBroadcastGroup#c67a2e38: %w", err)
			}
		case "supergroup_id":
			value, err := b.Int53()
			if err != nil {
				return fmt.Errorf("unable to decode suggestedActionConvertToBroadcastGroup#c67a2e38: field supergroup_id: %w", err)
			}
			s.SupergroupID = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetSupergroupID returns value of SupergroupID field.
func (s *SuggestedActionConvertToBroadcastGroup) GetSupergroupID() (value int64) {
	if s == nil {
		return
	}
	return s.SupergroupID
}

// SuggestedActionSetPassword represents TL type `suggestedActionSetPassword#6f147d98`.
type SuggestedActionSetPassword struct {
	// The number of days to pass between consecutive authorizations if the user declines to
	// set password; if 0, then the user is advised to set the password for security reasons
	AuthorizationDelay int32
}

// SuggestedActionSetPasswordTypeID is TL type id of SuggestedActionSetPassword.
const SuggestedActionSetPasswordTypeID = 0x6f147d98

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionSetPassword) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionSetPassword{}
)

func (s *SuggestedActionSetPassword) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.AuthorizationDelay == 0) {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionSetPassword) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionSetPassword",
		ID:   SuggestedActionSetPasswordTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "AuthorizationDelay",
			SchemaName: "authorization_delay",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionSetPassword) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetPassword#6f147d98 as nil")
	}
	b.PutID(SuggestedActionSetPasswordTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionSetPassword) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetPassword#6f147d98 as nil")
	}
	b.PutInt32(s.AuthorizationDelay)
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionSetPassword) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetPassword#6f147d98 to nil")
	}
	if err := b.ConsumeID(SuggestedActionSetPasswordTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionSetPassword#6f147d98: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionSetPassword) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetPassword#6f147d98 to nil")
	}
	{
		value, err := b.Int32()
		if err != nil {
			return fmt.Errorf("unable to decode suggestedActionSetPassword#6f147d98: field authorization_delay: %w", err)
		}
		s.AuthorizationDelay = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionSetPassword) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetPassword#6f147d98 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionSetPassword")
	b.Comma()
	b.FieldStart("authorization_delay")
	b.PutInt32(s.AuthorizationDelay)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionSetPassword) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetPassword#6f147d98 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionSetPassword"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionSetPassword#6f147d98: %w", err)
			}
		case "authorization_delay":
			value, err := b.Int32()
			if err != nil {
				return fmt.Errorf("unable to decode suggestedActionSetPassword#6f147d98: field authorization_delay: %w", err)
			}
			s.AuthorizationDelay = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetAuthorizationDelay returns value of AuthorizationDelay field.
func (s *SuggestedActionSetPassword) GetAuthorizationDelay() (value int32) {
	if s == nil {
		return
	}
	return s.AuthorizationDelay
}

// SuggestedActionUpgradePremium represents TL type `suggestedActionUpgradePremium#70aa79fb`.
type SuggestedActionUpgradePremium struct {
}

// SuggestedActionUpgradePremiumTypeID is TL type id of SuggestedActionUpgradePremium.
const SuggestedActionUpgradePremiumTypeID = 0x70aa79fb

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionUpgradePremium) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionUpgradePremium{}
)

func (s *SuggestedActionUpgradePremium) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionUpgradePremium) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionUpgradePremium",
		ID:   SuggestedActionUpgradePremiumTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionUpgradePremium) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionUpgradePremium#70aa79fb as nil")
	}
	b.PutID(SuggestedActionUpgradePremiumTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionUpgradePremium) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionUpgradePremium#70aa79fb as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionUpgradePremium) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionUpgradePremium#70aa79fb to nil")
	}
	if err := b.ConsumeID(SuggestedActionUpgradePremiumTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionUpgradePremium#70aa79fb: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionUpgradePremium) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionUpgradePremium#70aa79fb to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionUpgradePremium) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionUpgradePremium#70aa79fb as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionUpgradePremium")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionUpgradePremium) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionUpgradePremium#70aa79fb to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionUpgradePremium"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionUpgradePremium#70aa79fb: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionRestorePremium represents TL type `suggestedActionRestorePremium#e909dd64`.
type SuggestedActionRestorePremium struct {
}

// SuggestedActionRestorePremiumTypeID is TL type id of SuggestedActionRestorePremium.
const SuggestedActionRestorePremiumTypeID = 0xe909dd64

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionRestorePremium) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionRestorePremium{}
)

func (s *SuggestedActionRestorePremium) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionRestorePremium) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionRestorePremium",
		ID:   SuggestedActionRestorePremiumTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionRestorePremium) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionRestorePremium#e909dd64 as nil")
	}
	b.PutID(SuggestedActionRestorePremiumTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionRestorePremium) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionRestorePremium#e909dd64 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionRestorePremium) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionRestorePremium#e909dd64 to nil")
	}
	if err := b.ConsumeID(SuggestedActionRestorePremiumTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionRestorePremium#e909dd64: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionRestorePremium) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionRestorePremium#e909dd64 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionRestorePremium) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionRestorePremium#e909dd64 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionRestorePremium")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionRestorePremium) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionRestorePremium#e909dd64 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionRestorePremium"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionRestorePremium#e909dd64: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionSubscribeToAnnualPremium represents TL type `suggestedActionSubscribeToAnnualPremium#164978bb`.
type SuggestedActionSubscribeToAnnualPremium struct {
}

// SuggestedActionSubscribeToAnnualPremiumTypeID is TL type id of SuggestedActionSubscribeToAnnualPremium.
const SuggestedActionSubscribeToAnnualPremiumTypeID = 0x164978bb

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionSubscribeToAnnualPremium) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionSubscribeToAnnualPremium{}
)

func (s *SuggestedActionSubscribeToAnnualPremium) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionSubscribeToAnnualPremium) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionSubscribeToAnnualPremium",
		ID:   SuggestedActionSubscribeToAnnualPremiumTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionSubscribeToAnnualPremium) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSubscribeToAnnualPremium#164978bb as nil")
	}
	b.PutID(SuggestedActionSubscribeToAnnualPremiumTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionSubscribeToAnnualPremium) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSubscribeToAnnualPremium#164978bb as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionSubscribeToAnnualPremium) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSubscribeToAnnualPremium#164978bb to nil")
	}
	if err := b.ConsumeID(SuggestedActionSubscribeToAnnualPremiumTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionSubscribeToAnnualPremium#164978bb: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionSubscribeToAnnualPremium) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSubscribeToAnnualPremium#164978bb to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionSubscribeToAnnualPremium) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSubscribeToAnnualPremium#164978bb as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionSubscribeToAnnualPremium")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionSubscribeToAnnualPremium) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSubscribeToAnnualPremium#164978bb to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionSubscribeToAnnualPremium"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionSubscribeToAnnualPremium#164978bb: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionGiftPremiumForChristmas represents TL type `suggestedActionGiftPremiumForChristmas#93b3ee6f`.
type SuggestedActionGiftPremiumForChristmas struct {
}

// SuggestedActionGiftPremiumForChristmasTypeID is TL type id of SuggestedActionGiftPremiumForChristmas.
const SuggestedActionGiftPremiumForChristmasTypeID = 0x93b3ee6f

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionGiftPremiumForChristmas) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionGiftPremiumForChristmas{}
)

func (s *SuggestedActionGiftPremiumForChristmas) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionGiftPremiumForChristmas) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionGiftPremiumForChristmas",
		ID:   SuggestedActionGiftPremiumForChristmasTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionGiftPremiumForChristmas) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionGiftPremiumForChristmas#93b3ee6f as nil")
	}
	b.PutID(SuggestedActionGiftPremiumForChristmasTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionGiftPremiumForChristmas) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionGiftPremiumForChristmas#93b3ee6f as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionGiftPremiumForChristmas) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionGiftPremiumForChristmas#93b3ee6f to nil")
	}
	if err := b.ConsumeID(SuggestedActionGiftPremiumForChristmasTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionGiftPremiumForChristmas#93b3ee6f: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionGiftPremiumForChristmas) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionGiftPremiumForChristmas#93b3ee6f to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionGiftPremiumForChristmas) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionGiftPremiumForChristmas#93b3ee6f as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionGiftPremiumForChristmas")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionGiftPremiumForChristmas) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionGiftPremiumForChristmas#93b3ee6f to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionGiftPremiumForChristmas"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionGiftPremiumForChristmas#93b3ee6f: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionSetBirthdate represents TL type `suggestedActionSetBirthdate#eabd9b02`.
type SuggestedActionSetBirthdate struct {
}

// SuggestedActionSetBirthdateTypeID is TL type id of SuggestedActionSetBirthdate.
const SuggestedActionSetBirthdateTypeID = 0xeabd9b02

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionSetBirthdate) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionSetBirthdate{}
)

func (s *SuggestedActionSetBirthdate) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionSetBirthdate) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionSetBirthdate",
		ID:   SuggestedActionSetBirthdateTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionSetBirthdate) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetBirthdate#eabd9b02 as nil")
	}
	b.PutID(SuggestedActionSetBirthdateTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionSetBirthdate) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetBirthdate#eabd9b02 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionSetBirthdate) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetBirthdate#eabd9b02 to nil")
	}
	if err := b.ConsumeID(SuggestedActionSetBirthdateTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionSetBirthdate#eabd9b02: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionSetBirthdate) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetBirthdate#eabd9b02 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionSetBirthdate) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetBirthdate#eabd9b02 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionSetBirthdate")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionSetBirthdate) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetBirthdate#eabd9b02 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionSetBirthdate"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionSetBirthdate#eabd9b02: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionSetProfilePhoto represents TL type `suggestedActionSetProfilePhoto#9fe23d6b`.
type SuggestedActionSetProfilePhoto struct {
}

// SuggestedActionSetProfilePhotoTypeID is TL type id of SuggestedActionSetProfilePhoto.
const SuggestedActionSetProfilePhotoTypeID = 0x9fe23d6b

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionSetProfilePhoto) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionSetProfilePhoto{}
)

func (s *SuggestedActionSetProfilePhoto) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionSetProfilePhoto) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionSetProfilePhoto",
		ID:   SuggestedActionSetProfilePhotoTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionSetProfilePhoto) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetProfilePhoto#9fe23d6b as nil")
	}
	b.PutID(SuggestedActionSetProfilePhotoTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionSetProfilePhoto) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetProfilePhoto#9fe23d6b as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionSetProfilePhoto) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetProfilePhoto#9fe23d6b to nil")
	}
	if err := b.ConsumeID(SuggestedActionSetProfilePhotoTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionSetProfilePhoto#9fe23d6b: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionSetProfilePhoto) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetProfilePhoto#9fe23d6b to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionSetProfilePhoto) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionSetProfilePhoto#9fe23d6b as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionSetProfilePhoto")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionSetProfilePhoto) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionSetProfilePhoto#9fe23d6b to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionSetProfilePhoto"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionSetProfilePhoto#9fe23d6b: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionExtendPremium represents TL type `suggestedActionExtendPremium#de405cca`.
type SuggestedActionExtendPremium struct {
	// A URL for managing Telegram Premium subscription
	ManagePremiumSubscriptionURL string
}

// SuggestedActionExtendPremiumTypeID is TL type id of SuggestedActionExtendPremium.
const SuggestedActionExtendPremiumTypeID = 0xde405cca

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionExtendPremium) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionExtendPremium{}
)

func (s *SuggestedActionExtendPremium) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.ManagePremiumSubscriptionURL == "") {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionExtendPremium) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionExtendPremium",
		ID:   SuggestedActionExtendPremiumTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "ManagePremiumSubscriptionURL",
			SchemaName: "manage_premium_subscription_url",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionExtendPremium) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendPremium#de405cca as nil")
	}
	b.PutID(SuggestedActionExtendPremiumTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionExtendPremium) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendPremium#de405cca as nil")
	}
	b.PutString(s.ManagePremiumSubscriptionURL)
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionExtendPremium) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendPremium#de405cca to nil")
	}
	if err := b.ConsumeID(SuggestedActionExtendPremiumTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionExtendPremium#de405cca: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionExtendPremium) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendPremium#de405cca to nil")
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode suggestedActionExtendPremium#de405cca: field manage_premium_subscription_url: %w", err)
		}
		s.ManagePremiumSubscriptionURL = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionExtendPremium) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendPremium#de405cca as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionExtendPremium")
	b.Comma()
	b.FieldStart("manage_premium_subscription_url")
	b.PutString(s.ManagePremiumSubscriptionURL)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionExtendPremium) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendPremium#de405cca to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionExtendPremium"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionExtendPremium#de405cca: %w", err)
			}
		case "manage_premium_subscription_url":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode suggestedActionExtendPremium#de405cca: field manage_premium_subscription_url: %w", err)
			}
			s.ManagePremiumSubscriptionURL = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetManagePremiumSubscriptionURL returns value of ManagePremiumSubscriptionURL field.
func (s *SuggestedActionExtendPremium) GetManagePremiumSubscriptionURL() (value string) {
	if s == nil {
		return
	}
	return s.ManagePremiumSubscriptionURL
}

// SuggestedActionExtendStarSubscriptions represents TL type `suggestedActionExtendStarSubscriptions#fd32d556`.
type SuggestedActionExtendStarSubscriptions struct {
}

// SuggestedActionExtendStarSubscriptionsTypeID is TL type id of SuggestedActionExtendStarSubscriptions.
const SuggestedActionExtendStarSubscriptionsTypeID = 0xfd32d556

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionExtendStarSubscriptions) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionExtendStarSubscriptions{}
)

func (s *SuggestedActionExtendStarSubscriptions) Zero() bool {
	if s == nil {
		return true
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionExtendStarSubscriptions) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionExtendStarSubscriptions",
		ID:   SuggestedActionExtendStarSubscriptionsTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionExtendStarSubscriptions) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendStarSubscriptions#fd32d556 as nil")
	}
	b.PutID(SuggestedActionExtendStarSubscriptionsTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionExtendStarSubscriptions) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendStarSubscriptions#fd32d556 as nil")
	}
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionExtendStarSubscriptions) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendStarSubscriptions#fd32d556 to nil")
	}
	if err := b.ConsumeID(SuggestedActionExtendStarSubscriptionsTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionExtendStarSubscriptions#fd32d556: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionExtendStarSubscriptions) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendStarSubscriptions#fd32d556 to nil")
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionExtendStarSubscriptions) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionExtendStarSubscriptions#fd32d556 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionExtendStarSubscriptions")
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionExtendStarSubscriptions) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionExtendStarSubscriptions#fd32d556 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionExtendStarSubscriptions"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionExtendStarSubscriptions#fd32d556: %w", err)
			}
		default:
			return b.Skip()
		}
		return nil
	})
}

// SuggestedActionCustom represents TL type `suggestedActionCustom#7cbec343`.
type SuggestedActionCustom struct {
	// Unique name of the suggestion
	Name string
	// Title of the suggestion
	Title FormattedText
	// A custom suggestion to be shown at the top of the chat list
	Description FormattedText
	// The link to open when the suggestion is clicked
	URL string
}

// SuggestedActionCustomTypeID is TL type id of SuggestedActionCustom.
const SuggestedActionCustomTypeID = 0x7cbec343

// construct implements constructor of SuggestedActionClass.
func (s SuggestedActionCustom) construct() SuggestedActionClass { return &s }

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

	_ SuggestedActionClass = &SuggestedActionCustom{}
)

func (s *SuggestedActionCustom) Zero() bool {
	if s == nil {
		return true
	}
	if !(s.Name == "") {
		return false
	}
	if !(s.Title.Zero()) {
		return false
	}
	if !(s.Description.Zero()) {
		return false
	}
	if !(s.URL == "") {
		return false
	}

	return true
}

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

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

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

// TypeInfo returns info about TL type.
func (s *SuggestedActionCustom) TypeInfo() tdp.Type {
	typ := tdp.Type{
		Name: "suggestedActionCustom",
		ID:   SuggestedActionCustomTypeID,
	}
	if s == nil {
		typ.Null = true
		return typ
	}
	typ.Fields = []tdp.Field{
		{
			Name:       "Name",
			SchemaName: "name",
		},
		{
			Name:       "Title",
			SchemaName: "title",
		},
		{
			Name:       "Description",
			SchemaName: "description",
		},
		{
			Name:       "URL",
			SchemaName: "url",
		},
	}
	return typ
}

// Encode implements bin.Encoder.
func (s *SuggestedActionCustom) Encode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCustom#7cbec343 as nil")
	}
	b.PutID(SuggestedActionCustomTypeID)
	return s.EncodeBare(b)
}

// EncodeBare implements bin.BareEncoder.
func (s *SuggestedActionCustom) EncodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCustom#7cbec343 as nil")
	}
	b.PutString(s.Name)
	if err := s.Title.Encode(b); err != nil {
		return fmt.Errorf("unable to encode suggestedActionCustom#7cbec343: field title: %w", err)
	}
	if err := s.Description.Encode(b); err != nil {
		return fmt.Errorf("unable to encode suggestedActionCustom#7cbec343: field description: %w", err)
	}
	b.PutString(s.URL)
	return nil
}

// Decode implements bin.Decoder.
func (s *SuggestedActionCustom) Decode(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCustom#7cbec343 to nil")
	}
	if err := b.ConsumeID(SuggestedActionCustomTypeID); err != nil {
		return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: %w", err)
	}
	return s.DecodeBare(b)
}

// DecodeBare implements bin.BareDecoder.
func (s *SuggestedActionCustom) DecodeBare(b *bin.Buffer) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCustom#7cbec343 to nil")
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field name: %w", err)
		}
		s.Name = value
	}
	{
		if err := s.Title.Decode(b); err != nil {
			return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field title: %w", err)
		}
	}
	{
		if err := s.Description.Decode(b); err != nil {
			return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field description: %w", err)
		}
	}
	{
		value, err := b.String()
		if err != nil {
			return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field url: %w", err)
		}
		s.URL = value
	}
	return nil
}

// EncodeTDLibJSON implements tdjson.TDLibEncoder.
func (s *SuggestedActionCustom) EncodeTDLibJSON(b tdjson.Encoder) error {
	if s == nil {
		return fmt.Errorf("can't encode suggestedActionCustom#7cbec343 as nil")
	}
	b.ObjStart()
	b.PutID("suggestedActionCustom")
	b.Comma()
	b.FieldStart("name")
	b.PutString(s.Name)
	b.Comma()
	b.FieldStart("title")
	if err := s.Title.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode suggestedActionCustom#7cbec343: field title: %w", err)
	}
	b.Comma()
	b.FieldStart("description")
	if err := s.Description.EncodeTDLibJSON(b); err != nil {
		return fmt.Errorf("unable to encode suggestedActionCustom#7cbec343: field description: %w", err)
	}
	b.Comma()
	b.FieldStart("url")
	b.PutString(s.URL)
	b.Comma()
	b.StripComma()
	b.ObjEnd()
	return nil
}

// DecodeTDLibJSON implements tdjson.TDLibDecoder.
func (s *SuggestedActionCustom) DecodeTDLibJSON(b tdjson.Decoder) error {
	if s == nil {
		return fmt.Errorf("can't decode suggestedActionCustom#7cbec343 to nil")
	}

	return b.Obj(func(b tdjson.Decoder, key []byte) error {
		switch string(key) {
		case tdjson.TypeField:
			if err := b.ConsumeID("suggestedActionCustom"); err != nil {
				return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: %w", err)
			}
		case "name":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field name: %w", err)
			}
			s.Name = value
		case "title":
			if err := s.Title.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field title: %w", err)
			}
		case "description":
			if err := s.Description.DecodeTDLibJSON(b); err != nil {
				return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field description: %w", err)
			}
		case "url":
			value, err := b.String()
			if err != nil {
				return fmt.Errorf("unable to decode suggestedActionCustom#7cbec343: field url: %w", err)
			}
			s.URL = value
		default:
			return b.Skip()
		}
		return nil
	})
}

// GetName returns value of Name field.
func (s *SuggestedActionCustom) GetName() (value string) {
	if s == nil {
		return
	}
	return s.Name
}

// GetTitle returns value of Title field.
func (s *SuggestedActionCustom) GetTitle() (value FormattedText) {
	if s == nil {
		return
	}
	return s.Title
}

// GetDescription returns value of Description field.
func (s *SuggestedActionCustom) GetDescription() (value FormattedText) {
	if s == nil {
		return
	}
	return s.Description
}

// GetURL returns value of URL field.
func (s *SuggestedActionCustom) GetURL() (value string) {
	if s == nil {
		return
	}
	return s.URL
}

// SuggestedActionClassName is schema name of SuggestedActionClass.
const SuggestedActionClassName = "SuggestedAction"

// SuggestedActionClass represents SuggestedAction generic type.
//
// Example:
//
//	g, err := tdapi.DecodeSuggestedAction(buf)
//	if err != nil {
//	    panic(err)
//	}
//	switch v := g.(type) {
//	case *tdapi.SuggestedActionEnableArchiveAndMuteNewChats: // suggestedActionEnableArchiveAndMuteNewChats#7841ec4f
//	case *tdapi.SuggestedActionCheckPassword: // suggestedActionCheckPassword#71e072b7
//	case *tdapi.SuggestedActionCheckPhoneNumber: // suggestedActionCheckPhoneNumber#26ab77eb
//	case *tdapi.SuggestedActionViewChecksHint: // suggestedActionViewChecksHint#35203547
//	case *tdapi.SuggestedActionConvertToBroadcastGroup: // suggestedActionConvertToBroadcastGroup#c67a2e38
//	case *tdapi.SuggestedActionSetPassword: // suggestedActionSetPassword#6f147d98
//	case *tdapi.SuggestedActionUpgradePremium: // suggestedActionUpgradePremium#70aa79fb
//	case *tdapi.SuggestedActionRestorePremium: // suggestedActionRestorePremium#e909dd64
//	case *tdapi.SuggestedActionSubscribeToAnnualPremium: // suggestedActionSubscribeToAnnualPremium#164978bb
//	case *tdapi.SuggestedActionGiftPremiumForChristmas: // suggestedActionGiftPremiumForChristmas#93b3ee6f
//	case *tdapi.SuggestedActionSetBirthdate: // suggestedActionSetBirthdate#eabd9b02
//	case *tdapi.SuggestedActionSetProfilePhoto: // suggestedActionSetProfilePhoto#9fe23d6b
//	case *tdapi.SuggestedActionExtendPremium: // suggestedActionExtendPremium#de405cca
//	case *tdapi.SuggestedActionExtendStarSubscriptions: // suggestedActionExtendStarSubscriptions#fd32d556
//	case *tdapi.SuggestedActionCustom: // suggestedActionCustom#7cbec343
//	default: panic(v)
//	}
type SuggestedActionClass interface {
	bin.Encoder
	bin.Decoder
	bin.BareEncoder
	bin.BareDecoder
	construct() SuggestedActionClass

	// 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

	EncodeTDLibJSON(b tdjson.Encoder) error
	DecodeTDLibJSON(b tdjson.Decoder) error
}

// DecodeSuggestedAction implements binary de-serialization for SuggestedActionClass.
func DecodeSuggestedAction(buf *bin.Buffer) (SuggestedActionClass, error) {
	id, err := buf.PeekID()
	if err != nil {
		return nil, err
	}
	switch id {
	case SuggestedActionEnableArchiveAndMuteNewChatsTypeID:
		// Decoding suggestedActionEnableArchiveAndMuteNewChats#7841ec4f.
		v := SuggestedActionEnableArchiveAndMuteNewChats{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionCheckPasswordTypeID:
		// Decoding suggestedActionCheckPassword#71e072b7.
		v := SuggestedActionCheckPassword{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionCheckPhoneNumberTypeID:
		// Decoding suggestedActionCheckPhoneNumber#26ab77eb.
		v := SuggestedActionCheckPhoneNumber{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionViewChecksHintTypeID:
		// Decoding suggestedActionViewChecksHint#35203547.
		v := SuggestedActionViewChecksHint{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionConvertToBroadcastGroupTypeID:
		// Decoding suggestedActionConvertToBroadcastGroup#c67a2e38.
		v := SuggestedActionConvertToBroadcastGroup{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionSetPasswordTypeID:
		// Decoding suggestedActionSetPassword#6f147d98.
		v := SuggestedActionSetPassword{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionUpgradePremiumTypeID:
		// Decoding suggestedActionUpgradePremium#70aa79fb.
		v := SuggestedActionUpgradePremium{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionRestorePremiumTypeID:
		// Decoding suggestedActionRestorePremium#e909dd64.
		v := SuggestedActionRestorePremium{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionSubscribeToAnnualPremiumTypeID:
		// Decoding suggestedActionSubscribeToAnnualPremium#164978bb.
		v := SuggestedActionSubscribeToAnnualPremium{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionGiftPremiumForChristmasTypeID:
		// Decoding suggestedActionGiftPremiumForChristmas#93b3ee6f.
		v := SuggestedActionGiftPremiumForChristmas{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionSetBirthdateTypeID:
		// Decoding suggestedActionSetBirthdate#eabd9b02.
		v := SuggestedActionSetBirthdate{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionSetProfilePhotoTypeID:
		// Decoding suggestedActionSetProfilePhoto#9fe23d6b.
		v := SuggestedActionSetProfilePhoto{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionExtendPremiumTypeID:
		// Decoding suggestedActionExtendPremium#de405cca.
		v := SuggestedActionExtendPremium{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionExtendStarSubscriptionsTypeID:
		// Decoding suggestedActionExtendStarSubscriptions#fd32d556.
		v := SuggestedActionExtendStarSubscriptions{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case SuggestedActionCustomTypeID:
		// Decoding suggestedActionCustom#7cbec343.
		v := SuggestedActionCustom{}
		if err := v.Decode(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", bin.NewUnexpectedID(id))
	}
}

// DecodeTDLibJSONSuggestedAction implements binary de-serialization for SuggestedActionClass.
func DecodeTDLibJSONSuggestedAction(buf tdjson.Decoder) (SuggestedActionClass, error) {
	id, err := buf.FindTypeID()
	if err != nil {
		return nil, err
	}
	switch id {
	case "suggestedActionEnableArchiveAndMuteNewChats":
		// Decoding suggestedActionEnableArchiveAndMuteNewChats#7841ec4f.
		v := SuggestedActionEnableArchiveAndMuteNewChats{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionCheckPassword":
		// Decoding suggestedActionCheckPassword#71e072b7.
		v := SuggestedActionCheckPassword{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionCheckPhoneNumber":
		// Decoding suggestedActionCheckPhoneNumber#26ab77eb.
		v := SuggestedActionCheckPhoneNumber{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionViewChecksHint":
		// Decoding suggestedActionViewChecksHint#35203547.
		v := SuggestedActionViewChecksHint{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionConvertToBroadcastGroup":
		// Decoding suggestedActionConvertToBroadcastGroup#c67a2e38.
		v := SuggestedActionConvertToBroadcastGroup{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionSetPassword":
		// Decoding suggestedActionSetPassword#6f147d98.
		v := SuggestedActionSetPassword{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionUpgradePremium":
		// Decoding suggestedActionUpgradePremium#70aa79fb.
		v := SuggestedActionUpgradePremium{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionRestorePremium":
		// Decoding suggestedActionRestorePremium#e909dd64.
		v := SuggestedActionRestorePremium{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionSubscribeToAnnualPremium":
		// Decoding suggestedActionSubscribeToAnnualPremium#164978bb.
		v := SuggestedActionSubscribeToAnnualPremium{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionGiftPremiumForChristmas":
		// Decoding suggestedActionGiftPremiumForChristmas#93b3ee6f.
		v := SuggestedActionGiftPremiumForChristmas{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionSetBirthdate":
		// Decoding suggestedActionSetBirthdate#eabd9b02.
		v := SuggestedActionSetBirthdate{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionSetProfilePhoto":
		// Decoding suggestedActionSetProfilePhoto#9fe23d6b.
		v := SuggestedActionSetProfilePhoto{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionExtendPremium":
		// Decoding suggestedActionExtendPremium#de405cca.
		v := SuggestedActionExtendPremium{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionExtendStarSubscriptions":
		// Decoding suggestedActionExtendStarSubscriptions#fd32d556.
		v := SuggestedActionExtendStarSubscriptions{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	case "suggestedActionCustom":
		// Decoding suggestedActionCustom#7cbec343.
		v := SuggestedActionCustom{}
		if err := v.DecodeTDLibJSON(buf); err != nil {
			return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", err)
		}
		return &v, nil
	default:
		return nil, fmt.Errorf("unable to decode SuggestedActionClass: %w", tdjson.NewUnexpectedID(id))
	}
}

// SuggestedAction boxes the SuggestedActionClass providing a helper.
type SuggestedActionBox struct {
	SuggestedAction SuggestedActionClass
}

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

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

// DecodeTDLibJSON implements bin.Decoder for SuggestedActionBox.
func (b *SuggestedActionBox) DecodeTDLibJSON(buf tdjson.Decoder) error {
	if b == nil {
		return fmt.Errorf("unable to decode SuggestedActionBox to nil")
	}
	v, err := DecodeTDLibJSONSuggestedAction(buf)
	if err != nil {
		return fmt.Errorf("unable to decode boxed value: %w", err)
	}
	b.SuggestedAction = v
	return nil
}

// EncodeTDLibJSON implements bin.Encode for SuggestedActionBox.
func (b *SuggestedActionBox) EncodeTDLibJSON(buf tdjson.Encoder) error {
	if b == nil || b.SuggestedAction == nil {
		return fmt.Errorf("unable to encode SuggestedActionClass as nil")
	}
	return b.SuggestedAction.EncodeTDLibJSON(buf)
}
