// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/extension_setting_device.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Possbile device types for an extension setting.
type ExtensionSettingDeviceEnum_ExtensionSettingDevice int32

const (
	// Not specified.
	ExtensionSettingDeviceEnum_UNSPECIFIED ExtensionSettingDeviceEnum_ExtensionSettingDevice = 0
	// The value is unknown in this version.
	ExtensionSettingDeviceEnum_UNKNOWN ExtensionSettingDeviceEnum_ExtensionSettingDevice = 1
	// Mobile. The extensions in the extension setting will only serve on
	// mobile devices.
	ExtensionSettingDeviceEnum_MOBILE ExtensionSettingDeviceEnum_ExtensionSettingDevice = 2
	// Desktop. The extensions in the extension setting will only serve on
	// desktop devices.
	ExtensionSettingDeviceEnum_DESKTOP ExtensionSettingDeviceEnum_ExtensionSettingDevice = 3
)

var ExtensionSettingDeviceEnum_ExtensionSettingDevice_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "MOBILE",
	3: "DESKTOP",
}

var ExtensionSettingDeviceEnum_ExtensionSettingDevice_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"MOBILE":      2,
	"DESKTOP":     3,
}

func (x ExtensionSettingDeviceEnum_ExtensionSettingDevice) String() string {
	return proto.EnumName(ExtensionSettingDeviceEnum_ExtensionSettingDevice_name, int32(x))
}

func (ExtensionSettingDeviceEnum_ExtensionSettingDevice) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d12dc0a0593aa785, []int{0, 0}
}

// Container for enum describing extension setting device types.
type ExtensionSettingDeviceEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ExtensionSettingDeviceEnum) Reset()         { *m = ExtensionSettingDeviceEnum{} }
func (m *ExtensionSettingDeviceEnum) String() string { return proto.CompactTextString(m) }
func (*ExtensionSettingDeviceEnum) ProtoMessage()    {}
func (*ExtensionSettingDeviceEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_d12dc0a0593aa785, []int{0}
}

func (m *ExtensionSettingDeviceEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExtensionSettingDeviceEnum.Unmarshal(m, b)
}
func (m *ExtensionSettingDeviceEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExtensionSettingDeviceEnum.Marshal(b, m, deterministic)
}
func (m *ExtensionSettingDeviceEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExtensionSettingDeviceEnum.Merge(m, src)
}
func (m *ExtensionSettingDeviceEnum) XXX_Size() int {
	return xxx_messageInfo_ExtensionSettingDeviceEnum.Size(m)
}
func (m *ExtensionSettingDeviceEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_ExtensionSettingDeviceEnum.DiscardUnknown(m)
}

var xxx_messageInfo_ExtensionSettingDeviceEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice", ExtensionSettingDeviceEnum_ExtensionSettingDevice_name, ExtensionSettingDeviceEnum_ExtensionSettingDevice_value)
	proto.RegisterType((*ExtensionSettingDeviceEnum)(nil), "google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/extension_setting_device.proto", fileDescriptor_d12dc0a0593aa785)
}

var fileDescriptor_d12dc0a0593aa785 = []byte{
	// 309 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
	0x1c, 0xc6, 0x5d, 0x07, 0x13, 0xb2, 0x83, 0xa5, 0x07, 0x0f, 0xd3, 0x1d, 0xb6, 0x07, 0x48, 0x0e,
	0xb9, 0x45, 0x2f, 0xad, 0x8b, 0x63, 0x4c, 0xdb, 0xc2, 0xdc, 0x04, 0x29, 0x8c, 0xba, 0x84, 0x10,
	0x58, 0x93, 0xb1, 0x64, 0xc3, 0xe7, 0xf1, 0xe8, 0xa3, 0xf8, 0x28, 0x9e, 0x7c, 0x04, 0x69, 0x62,
	0x7b, 0x9a, 0x5e, 0xca, 0x47, 0xbf, 0xff, 0xf7, 0xcb, 0xf7, 0xff, 0x83, 0x5b, 0xa1, 0xb5, 0xd8,
	0x72, 0x54, 0x32, 0x83, 0xbc, 0xac, 0xd5, 0x11, 0x23, 0xae, 0x0e, 0x95, 0x41, 0xfc, 0xcd, 0x72,
	0x65, 0xa4, 0x56, 0x6b, 0xc3, 0xad, 0x95, 0x4a, 0xac, 0x19, 0x3f, 0xca, 0x0d, 0x87, 0xbb, 0xbd,
	0xb6, 0x3a, 0x1a, 0xfa, 0x08, 0x2c, 0x99, 0x81, 0x6d, 0x1a, 0x1e, 0x31, 0x74, 0xe9, 0xc1, 0x75,
	0x03, 0xdf, 0x49, 0x54, 0x2a, 0xa5, 0x6d, 0x69, 0xa5, 0x56, 0xc6, 0x87, 0xc7, 0x15, 0x18, 0xd0,
	0x06, 0xbf, 0xf0, 0xf4, 0x89, 0x83, 0x53, 0x75, 0xa8, 0xc6, 0x19, 0xb8, 0x3c, 0xed, 0x46, 0x17,
	0xa0, 0xbf, 0x4c, 0x17, 0x39, 0xbd, 0x9b, 0xdd, 0xcf, 0xe8, 0x24, 0x3c, 0x8b, 0xfa, 0xe0, 0x7c,
	0x99, 0xce, 0xd3, 0xec, 0x39, 0x0d, 0x3b, 0x11, 0x00, 0xbd, 0xc7, 0x2c, 0x99, 0x3d, 0xd0, 0x30,
	0xa8, 0x8d, 0x09, 0x5d, 0xcc, 0x9f, 0xb2, 0x3c, 0xec, 0x26, 0xdf, 0x1d, 0x30, 0xda, 0xe8, 0x0a,
	0xfe, 0x5b, 0x39, 0xb9, 0x3a, 0xfd, 0x68, 0x5e, 0x37, 0xce, 0x3b, 0x2f, 0xc9, 0x6f, 0x5a, 0xe8,
	0x6d, 0xa9, 0x04, 0xd4, 0x7b, 0x81, 0x04, 0x57, 0x6e, 0x9f, 0xe6, 0x7c, 0x3b, 0x69, 0xfe, 0xb8,
	0xe6, 0x8d, 0xfb, 0xbe, 0x07, 0xdd, 0x69, 0x1c, 0x7f, 0x04, 0xc3, 0xa9, 0x47, 0xc5, 0xcc, 0x40,
	0x2f, 0x6b, 0xb5, 0xc2, 0xb0, 0x5e, 0xdf, 0x7c, 0x36, 0x7e, 0x11, 0x33, 0x53, 0xb4, 0x7e, 0xb1,
	0xc2, 0x85, 0xf3, 0xbf, 0x82, 0x91, 0xff, 0x49, 0x48, 0xcc, 0x0c, 0x21, 0xed, 0x04, 0x21, 0x2b,
	0x4c, 0x88, 0x9b, 0x79, 0xed, 0xb9, 0x62, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x15, 0xea, 0xb4,
	0x28, 0xe5, 0x01, 0x00, 0x00,
}
