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

// Possible values for Call placeholder fields.
type CallPlaceholderFieldEnum_CallPlaceholderField int32

const (
	// Not specified.
	CallPlaceholderFieldEnum_UNSPECIFIED CallPlaceholderFieldEnum_CallPlaceholderField = 0
	// Used for return value only. Represents value unknown in this version.
	CallPlaceholderFieldEnum_UNKNOWN CallPlaceholderFieldEnum_CallPlaceholderField = 1
	// Data Type: STRING. The advertiser's phone number to append to the ad.
	CallPlaceholderFieldEnum_PHONE_NUMBER CallPlaceholderFieldEnum_CallPlaceholderField = 2
	// Data Type: STRING. Uppercase two-letter country code of the advertiser's
	// phone number.
	CallPlaceholderFieldEnum_COUNTRY_CODE CallPlaceholderFieldEnum_CallPlaceholderField = 3
	// Data Type: BOOLEAN. Indicates whether call tracking is enabled. Default:
	// true.
	CallPlaceholderFieldEnum_TRACKED CallPlaceholderFieldEnum_CallPlaceholderField = 4
	// Data Type: INT64. The ID of an AdCallMetricsConversion object. This
	// object contains the phoneCallDurationfield which is the minimum duration
	// (in seconds) of a call to be considered a conversion.
	CallPlaceholderFieldEnum_CONVERSION_TYPE_ID CallPlaceholderFieldEnum_CallPlaceholderField = 5
	// Data Type: STRING. Indicates whether this call extension uses its own
	// call conversion setting or follows the account level setting.
	// Valid values are: USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION and
	// USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION.
	CallPlaceholderFieldEnum_CONVERSION_REPORTING_STATE CallPlaceholderFieldEnum_CallPlaceholderField = 6
)

// Enum value maps for CallPlaceholderFieldEnum_CallPlaceholderField.
var (
	CallPlaceholderFieldEnum_CallPlaceholderField_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "PHONE_NUMBER",
		3: "COUNTRY_CODE",
		4: "TRACKED",
		5: "CONVERSION_TYPE_ID",
		6: "CONVERSION_REPORTING_STATE",
	}
	CallPlaceholderFieldEnum_CallPlaceholderField_value = map[string]int32{
		"UNSPECIFIED":                0,
		"UNKNOWN":                    1,
		"PHONE_NUMBER":               2,
		"COUNTRY_CODE":               3,
		"TRACKED":                    4,
		"CONVERSION_TYPE_ID":         5,
		"CONVERSION_REPORTING_STATE": 6,
	}
)

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

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

func (CallPlaceholderFieldEnum_CallPlaceholderField) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_call_placeholder_field_proto_enumTypes[0].Descriptor()
}

func (CallPlaceholderFieldEnum_CallPlaceholderField) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_call_placeholder_field_proto_enumTypes[0]
}

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

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

// Values for Call placeholder fields.
type CallPlaceholderFieldEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CallPlaceholderFieldEnum) ProtoMessage() {}

func (x *CallPlaceholderFieldEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v1_enums_call_placeholder_field_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 CallPlaceholderFieldEnum.ProtoReflect.Descriptor instead.
func (*CallPlaceholderFieldEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_call_placeholder_field_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDesc = []byte{
	0x0a, 0x3a, 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,
	0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72,
	0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 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, 0xba, 0x01, 0x0a, 0x18, 0x43, 0x61,
	0x6c, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x46, 0x69, 0x65,
	0x6c, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x9d, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x6c, 0x6c, 0x50,
	0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 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, 0x10, 0x0a,
	0x0c, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12,
	0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10,
	0x03, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16,
	0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50,
	0x45, 0x5f, 0x49, 0x44, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x52,
	0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53,
	0x54, 0x41, 0x54, 0x45, 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, 0x43, 0x61,
	0x6c, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x46, 0x69, 0x65,
	0x6c, 0x64, 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_call_placeholder_field_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescData = file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_call_placeholder_field_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_call_placeholder_field_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_call_placeholder_field_proto_goTypes = []interface{}{
	(CallPlaceholderFieldEnum_CallPlaceholderField)(0), // 0: google.ads.googleads.v1.enums.CallPlaceholderFieldEnum.CallPlaceholderField
	(*CallPlaceholderFieldEnum)(nil),                   // 1: google.ads.googleads.v1.enums.CallPlaceholderFieldEnum
}
var file_google_ads_googleads_v1_enums_call_placeholder_field_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_call_placeholder_field_proto_init() }
func file_google_ads_googleads_v1_enums_call_placeholder_field_proto_init() {
	if File_google_ads_googleads_v1_enums_call_placeholder_field_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_call_placeholder_field_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CallPlaceholderFieldEnum); 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_call_placeholder_field_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_call_placeholder_field_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_call_placeholder_field_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_call_placeholder_field_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_call_placeholder_field_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_call_placeholder_field_proto = out.File
	file_google_ads_googleads_v1_enums_call_placeholder_field_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_call_placeholder_field_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_call_placeholder_field_proto_depIdxs = nil
}
