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

// Operating System
type AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType int32

const (
	// Not specified.
	AppUrlOperatingSystemTypeEnum_UNSPECIFIED AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 0
	// Used for return value only. Represents value unknown in this version.
	AppUrlOperatingSystemTypeEnum_UNKNOWN AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 1
	// The Apple IOS operating system.
	AppUrlOperatingSystemTypeEnum_IOS AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 2
	// The Android operating system.
	AppUrlOperatingSystemTypeEnum_ANDROID AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType = 3
)

// Enum value maps for AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType.
var (
	AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "IOS",
		3: "ANDROID",
	}
	AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"IOS":         2,
		"ANDROID":     3,
	}
)

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

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

func (AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_enumTypes[0].Descriptor()
}

func (AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_enumTypes[0]
}

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

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

// The possible OS types for a deeplink AppUrl.
type AppUrlOperatingSystemTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*AppUrlOperatingSystemTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_app_url_operating_system_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDesc = []byte{
	0x0a, 0x41, 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,
	0x61, 0x70, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e,
	0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 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, 0x70, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x55, 0x72, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
	0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75,
	0x6d, 0x22, 0x4f, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x55, 0x72, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61,
	0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 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, 0x07, 0x0a, 0x03,
	0x49, 0x4f, 0x53, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44,
	0x10, 0x03, 0x42, 0xf3, 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, 0x1e, 0x41, 0x70, 0x70, 0x55, 0x72, 0x6c,
	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 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_app_url_operating_system_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescData = file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_goTypes = []interface{}{
	(AppUrlOperatingSystemTypeEnum_AppUrlOperatingSystemType)(0), // 0: google.ads.googleads.v1.enums.AppUrlOperatingSystemTypeEnum.AppUrlOperatingSystemType
	(*AppUrlOperatingSystemTypeEnum)(nil),                        // 1: google.ads.googleads.v1.enums.AppUrlOperatingSystemTypeEnum
}
var file_google_ads_googleads_v1_enums_app_url_operating_system_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_app_url_operating_system_type_proto_init() }
func file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_init() {
	if File_google_ads_googleads_v1_enums_app_url_operating_system_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AppUrlOperatingSystemTypeEnum); 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_app_url_operating_system_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_app_url_operating_system_type_proto = out.File
	file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_app_url_operating_system_type_proto_depIdxs = nil
}
