// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/access_reason.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

// Enum describing possible access reasons.
type AccessReasonEnum_AccessReason int32

const (
	// Not specified.
	AccessReasonEnum_UNSPECIFIED AccessReasonEnum_AccessReason = 0
	// Used for return value only. Represents value unknown in this version.
	AccessReasonEnum_UNKNOWN AccessReasonEnum_AccessReason = 1
	// The resource is owned by the user.
	AccessReasonEnum_OWNED AccessReasonEnum_AccessReason = 2
	// The resource is shared to the user.
	AccessReasonEnum_SHARED AccessReasonEnum_AccessReason = 3
	// The resource is licensed to the user.
	AccessReasonEnum_LICENSED AccessReasonEnum_AccessReason = 4
	// The user subscribed to the resource.
	AccessReasonEnum_SUBSCRIBED AccessReasonEnum_AccessReason = 5
	// The resource is accessible to the user.
	AccessReasonEnum_AFFILIATED AccessReasonEnum_AccessReason = 6
)

var AccessReasonEnum_AccessReason_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "OWNED",
	3: "SHARED",
	4: "LICENSED",
	5: "SUBSCRIBED",
	6: "AFFILIATED",
}

var AccessReasonEnum_AccessReason_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"OWNED":       2,
	"SHARED":      3,
	"LICENSED":    4,
	"SUBSCRIBED":  5,
	"AFFILIATED":  6,
}

func (x AccessReasonEnum_AccessReason) String() string {
	return proto.EnumName(AccessReasonEnum_AccessReason_name, int32(x))
}

func (AccessReasonEnum_AccessReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6898016474772933, []int{0, 0}
}

// Indicates the way the resource such as user list is related to a user.
type AccessReasonEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AccessReasonEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AccessReasonEnum_AccessReason", AccessReasonEnum_AccessReason_name, AccessReasonEnum_AccessReason_value)
	proto.RegisterType((*AccessReasonEnum)(nil), "google.ads.googleads.v3.enums.AccessReasonEnum")
}

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

var fileDescriptor_6898016474772933 = []byte{
	// 336 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4e, 0xf2, 0x30,
	0x18, 0xfd, 0x37, 0x7e, 0x50, 0x0b, 0xd1, 0xda, 0x4b, 0x23, 0x17, 0xf0, 0x00, 0x5d, 0xcc, 0xee,
	0xea, 0x55, 0xc7, 0x0a, 0x2e, 0x92, 0x41, 0x98, 0x40, 0x62, 0x96, 0x98, 0xca, 0x96, 0x85, 0x04,
	0x5a, 0xe4, 0x03, 0xde, 0xc0, 0x17, 0xf1, 0xd2, 0x47, 0xf1, 0x41, 0xbc, 0xf0, 0x29, 0xcc, 0x5a,
	0x21, 0xdc, 0xe8, 0x4d, 0x73, 0xfa, 0x7d, 0xe7, 0x9c, 0x7c, 0xe7, 0xa0, 0x9b, 0x42, 0xeb, 0x62,
	0x91, 0x7b, 0x32, 0x03, 0xcf, 0xc2, 0x12, 0xed, 0x7c, 0x2f, 0x57, 0xdb, 0x25, 0x78, 0x72, 0x36,
	0xcb, 0x01, 0x9e, 0xd6, 0xb9, 0x04, 0xad, 0xe8, 0x6a, 0xad, 0x37, 0x9a, 0x34, 0x2d, 0x8f, 0xca,
	0x0c, 0xe8, 0x41, 0x42, 0x77, 0x3e, 0x35, 0x92, 0xab, 0xeb, 0xbd, 0xe3, 0x6a, 0xee, 0x49, 0xa5,
	0xf4, 0x46, 0x6e, 0xe6, 0x5a, 0x81, 0x15, 0xb7, 0x5f, 0x1d, 0x84, 0xb9, 0x31, 0x1d, 0x19, 0x4f,
	0xa1, 0xb6, 0xcb, 0xf6, 0x0b, 0x6a, 0x1c, 0xcf, 0xc8, 0x05, 0xaa, 0x8f, 0xe3, 0x64, 0x28, 0x3a,
	0x51, 0x37, 0x12, 0x21, 0xfe, 0x47, 0xea, 0xe8, 0x64, 0x1c, 0xdf, 0xc7, 0x83, 0x69, 0x8c, 0x1d,
	0x72, 0x86, 0xaa, 0x83, 0x69, 0x2c, 0x42, 0xec, 0x12, 0x84, 0x6a, 0xc9, 0x1d, 0x1f, 0x89, 0x10,
	0x57, 0x48, 0x03, 0x9d, 0xf6, 0xa3, 0x8e, 0x88, 0x13, 0x11, 0xe2, 0xff, 0xe4, 0x1c, 0xa1, 0x64,
	0x1c, 0x24, 0x9d, 0x51, 0x14, 0x88, 0x10, 0x57, 0xcb, 0x3f, 0xef, 0x76, 0xa3, 0x7e, 0xc4, 0x1f,
	0x44, 0x88, 0x6b, 0xc1, 0xa7, 0x83, 0x5a, 0x33, 0xbd, 0xa4, 0x7f, 0x66, 0x09, 0x2e, 0x8f, 0xcf,
	0x1a, 0x96, 0x01, 0x86, 0xce, 0x63, 0xf0, 0xa3, 0x29, 0xf4, 0x42, 0xaa, 0x82, 0xea, 0x75, 0xe1,
	0x15, 0xb9, 0x32, 0xf1, 0xf6, 0x15, 0xae, 0xe6, 0xf0, 0x4b, 0xa3, 0xb7, 0xe6, 0x7d, 0x73, 0x2b,
	0x3d, 0xce, 0xdf, 0xdd, 0x66, 0xcf, 0x5a, 0xf1, 0x0c, 0xa8, 0x85, 0x25, 0x9a, 0xf8, 0xb4, 0xac,
	0x05, 0x3e, 0xf6, 0xfb, 0x94, 0x67, 0x90, 0x1e, 0xf6, 0xe9, 0xc4, 0x4f, 0xcd, 0xfe, 0xcb, 0x6d,
	0xd9, 0x21, 0x63, 0x3c, 0x03, 0xc6, 0x0e, 0x0c, 0xc6, 0x26, 0x3e, 0x63, 0x86, 0xf3, 0x5c, 0x33,
	0x87, 0xf9, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x6d, 0xce, 0xd8, 0xe9, 0x01, 0x00, 0x00,
}
