// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v1/enums/served_asset_field_type.proto

package enums

import (
	reflect "reflect"
	sync "sync"

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

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// The possible asset field types.
type ServedAssetFieldTypeEnum_ServedAssetFieldType int32

const (
	// No value has been specified.
	ServedAssetFieldTypeEnum_UNSPECIFIED ServedAssetFieldTypeEnum_ServedAssetFieldType = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	ServedAssetFieldTypeEnum_UNKNOWN ServedAssetFieldTypeEnum_ServedAssetFieldType = 1
	// The asset is used in headline 1.
	ServedAssetFieldTypeEnum_HEADLINE_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 2
	// The asset is used in headline 2.
	ServedAssetFieldTypeEnum_HEADLINE_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 3
	// The asset is used in headline 3.
	ServedAssetFieldTypeEnum_HEADLINE_3 ServedAssetFieldTypeEnum_ServedAssetFieldType = 4
	// The asset is used in description 1.
	ServedAssetFieldTypeEnum_DESCRIPTION_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 5
	// The asset is used in description 2.
	ServedAssetFieldTypeEnum_DESCRIPTION_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 6
)

// Enum value maps for ServedAssetFieldTypeEnum_ServedAssetFieldType.
var (
	ServedAssetFieldTypeEnum_ServedAssetFieldType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "HEADLINE_1",
		3: "HEADLINE_2",
		4: "HEADLINE_3",
		5: "DESCRIPTION_1",
		6: "DESCRIPTION_2",
	}
	ServedAssetFieldTypeEnum_ServedAssetFieldType_value = map[string]int32{
		"UNSPECIFIED":   0,
		"UNKNOWN":       1,
		"HEADLINE_1":    2,
		"HEADLINE_2":    3,
		"HEADLINE_3":    4,
		"DESCRIPTION_1": 5,
		"DESCRIPTION_2": 6,
	}
)

func (x ServedAssetFieldTypeEnum_ServedAssetFieldType) Enum() *ServedAssetFieldTypeEnum_ServedAssetFieldType {
	p := new(ServedAssetFieldTypeEnum_ServedAssetFieldType)
	*p = x
	return p
}

func (x ServedAssetFieldTypeEnum_ServedAssetFieldType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ServedAssetFieldTypeEnum_ServedAssetFieldType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_served_asset_field_type_proto_enumTypes[0].Descriptor()
}

func (ServedAssetFieldTypeEnum_ServedAssetFieldType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_served_asset_field_type_proto_enumTypes[0]
}

func (x ServedAssetFieldTypeEnum_ServedAssetFieldType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ServedAssetFieldTypeEnum_ServedAssetFieldType.Descriptor instead.
func (ServedAssetFieldTypeEnum_ServedAssetFieldType) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing possible asset field types.
type ServedAssetFieldTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *ServedAssetFieldTypeEnum) Reset() {
	*x = ServedAssetFieldTypeEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v1_enums_served_asset_field_type_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ServedAssetFieldTypeEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ServedAssetFieldTypeEnum) ProtoMessage() {}

func (x *ServedAssetFieldTypeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v1_enums_served_asset_field_type_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ServedAssetFieldTypeEnum.ProtoReflect.Descriptor instead.
func (*ServedAssetFieldTypeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_served_asset_field_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDesc = []byte{
	0x0a, 0x3b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x65,
	0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x53,
	0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54,
	0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x8a, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76,
	0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65,
	0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x0e,
	0x0a, 0x0a, 0x48, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x31, 0x10, 0x02, 0x12, 0x0e,
	0x0a, 0x0a, 0x48, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x32, 0x10, 0x03, 0x12, 0x0e,
	0x0a, 0x0a, 0x48, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x33, 0x10, 0x04, 0x12, 0x11,
	0x0a, 0x0d, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x31, 0x10,
	0x05, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e,
	0x5f, 0x32, 0x10, 0x06, 0x42, 0xee, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64,
	0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x19, 0x53, 0x65, 0x72, 0x76,
	0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65,
	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61,
	0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f,
	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41,
	0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a,
	0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x3a, 0x3a,
	0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescData = file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_served_asset_field_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_served_asset_field_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_served_asset_field_type_proto_goTypes = []interface{}{
	(ServedAssetFieldTypeEnum_ServedAssetFieldType)(0), // 0: google.ads.googleads.v1.enums.ServedAssetFieldTypeEnum.ServedAssetFieldType
	(*ServedAssetFieldTypeEnum)(nil),                   // 1: google.ads.googleads.v1.enums.ServedAssetFieldTypeEnum
}
var file_google_ads_googleads_v1_enums_served_asset_field_type_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v1_enums_served_asset_field_type_proto_init() }
func file_google_ads_googleads_v1_enums_served_asset_field_type_proto_init() {
	if File_google_ads_googleads_v1_enums_served_asset_field_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_served_asset_field_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServedAssetFieldTypeEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_served_asset_field_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_served_asset_field_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_served_asset_field_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_served_asset_field_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_served_asset_field_type_proto = out.File
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_served_asset_field_type_proto_depIdxs = nil
}
