// 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/v3/enums/structured_snippet_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 Structured Snippet placeholder fields.
type StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField int32

const (
	// Not specified.
	StructuredSnippetPlaceholderFieldEnum_UNSPECIFIED StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 0
	// Used for return value only. Represents value unknown in this version.
	StructuredSnippetPlaceholderFieldEnum_UNKNOWN StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 1
	// Data Type: STRING. The category of snippet of your products/services.
	// Must match exactly one of the predefined structured snippets headers.
	// For a list, visit
	// https://developers.google.com/adwords/api/docs/appendix/structured-snippet-headers
	StructuredSnippetPlaceholderFieldEnum_HEADER StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 2
	// Data Type: STRING_LIST. Text values that describe your products/services.
	// All text must be family safe. Special or non-ASCII characters are not
	// permitted. A snippet can be at most 25 characters.
	StructuredSnippetPlaceholderFieldEnum_SNIPPETS StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField = 3
)

// Enum value maps for StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField.
var (
	StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "HEADER",
		3: "SNIPPETS",
	}
	StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"HEADER":      2,
		"SNIPPETS":    3,
	}
)

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

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

func (StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_enumTypes[0].Descriptor()
}

func (StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_enumTypes[0]
}

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

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

// Values for Structured Snippet placeholder fields.
type StructuredSnippetPlaceholderFieldEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*StructuredSnippetPlaceholderFieldEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDesc = []byte{
	0x0a, 0x48, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x69, 0x70, 0x70,
	0x65, 0x74, 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, 0x33, 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, 0x84, 0x01, 0x0a, 0x25, 0x53, 0x74, 0x72, 0x75,
	0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 0x50, 0x6c, 0x61,
	0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x75,
	0x6d, 0x22, 0x5b, 0x0a, 0x21, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x53,
	0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 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, 0x0a, 0x0a, 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02,
	0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4e, 0x49, 0x50, 0x50, 0x45, 0x54, 0x53, 0x10, 0x03, 0x42, 0xfb,
	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, 0x33, 0x2e, 0x65,
	0x6e, 0x75, 0x6d, 0x73, 0x42, 0x26, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64,
	0x53, 0x6e, 0x69, 0x70, 0x70, 0x65, 0x74, 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, 0x33, 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, 0x33, 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, 0x33, 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, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescData = file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_goTypes = []interface{}{
	(StructuredSnippetPlaceholderFieldEnum_StructuredSnippetPlaceholderField)(0), // 0: google.ads.googleads.v3.enums.StructuredSnippetPlaceholderFieldEnum.StructuredSnippetPlaceholderField
	(*StructuredSnippetPlaceholderFieldEnum)(nil),                                // 1: google.ads.googleads.v3.enums.StructuredSnippetPlaceholderFieldEnum
}
var file_google_ads_googleads_v3_enums_structured_snippet_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_v3_enums_structured_snippet_placeholder_field_proto_init() }
func file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_init() {
	if File_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StructuredSnippetPlaceholderFieldEnum); 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_v3_enums_structured_snippet_placeholder_field_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto = out.File
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_structured_snippet_placeholder_field_proto_depIdxs = nil
}
