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

// Possible access role of a user.
type AccessRoleEnum_AccessRole int32

const (
	// Not specified.
	AccessRoleEnum_UNSPECIFIED AccessRoleEnum_AccessRole = 0
	// Used for return value only. Represents value unknown in this version.
	AccessRoleEnum_UNKNOWN AccessRoleEnum_AccessRole = 1
	// Owns its account and can control the addition of other users.
	AccessRoleEnum_ADMIN AccessRoleEnum_AccessRole = 2
	// Can modify campaigns, but can't affect other users.
	AccessRoleEnum_STANDARD AccessRoleEnum_AccessRole = 3
	// Can view campaigns and account changes, but cannot make edits.
	AccessRoleEnum_READ_ONLY AccessRoleEnum_AccessRole = 4
)

var AccessRoleEnum_AccessRole_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ADMIN",
	3: "STANDARD",
	4: "READ_ONLY",
}

var AccessRoleEnum_AccessRole_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ADMIN":       2,
	"STANDARD":    3,
	"READ_ONLY":   4,
}

func (x AccessRoleEnum_AccessRole) String() string {
	return proto.EnumName(AccessRoleEnum_AccessRole_name, int32(x))
}

func (AccessRoleEnum_AccessRole) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ea219286496feae1, []int{0, 0}
}

// Container for enum describing possible access role for user.
type AccessRoleEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AccessRoleEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AccessRoleEnum_AccessRole", AccessRoleEnum_AccessRole_name, AccessRoleEnum_AccessRole_value)
	proto.RegisterType((*AccessRoleEnum)(nil), "google.ads.googleads.v3.enums.AccessRoleEnum")
}

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

var fileDescriptor_ea219286496feae1 = []byte{
	// 307 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0x02, 0x31,
	0x14, 0x96, 0xc1, 0x3f, 0x8a, 0xca, 0xa4, 0x4b, 0x23, 0x0b, 0x38, 0x40, 0xbb, 0xe8, 0xae, 0xae,
	0x8a, 0x33, 0x12, 0xa2, 0x16, 0x32, 0x08, 0x46, 0x33, 0x09, 0xa9, 0xb4, 0x69, 0x48, 0x86, 0x96,
	0x50, 0xe0, 0x40, 0x2e, 0x3d, 0x8a, 0xe7, 0x70, 0xe5, 0x29, 0xcc, 0x74, 0x98, 0x61, 0xa5, 0x9b,
	0xe6, 0xcb, 0xfb, 0x7e, 0xfa, 0xbd, 0x07, 0xb0, 0xb6, 0x56, 0x67, 0x0a, 0x0b, 0xe9, 0xf6, 0x30,
	0x47, 0x3b, 0x82, 0x95, 0xd9, 0x2e, 0x1d, 0x16, 0xf3, 0xb9, 0x72, 0x6e, 0xb6, 0xb6, 0x99, 0x42,
	0xab, 0xb5, 0xdd, 0x58, 0xd8, 0x2e, 0x54, 0x48, 0x48, 0x87, 0x2a, 0x03, 0xda, 0x11, 0xe4, 0x0d,
	0xd7, 0x37, 0x65, 0xde, 0x6a, 0x81, 0x85, 0x31, 0x76, 0x23, 0x36, 0x0b, 0x6b, 0x5c, 0x61, 0xee,
	0x4a, 0x70, 0xc5, 0x7c, 0x62, 0x62, 0x33, 0x15, 0x9b, 0xed, 0xb2, 0x9b, 0x00, 0x70, 0x98, 0xc0,
	0x16, 0x68, 0x4e, 0xf8, 0x78, 0x14, 0xdf, 0x0d, 0xee, 0x07, 0x71, 0x14, 0x1e, 0xc1, 0x26, 0x38,
	0x9b, 0xf0, 0x07, 0x3e, 0x7c, 0xe1, 0x61, 0x0d, 0x36, 0xc0, 0x09, 0x8b, 0x9e, 0x06, 0x3c, 0x0c,
	0xe0, 0x05, 0x38, 0x1f, 0x3f, 0x33, 0x1e, 0xb1, 0x24, 0x0a, 0xeb, 0xf0, 0x12, 0x34, 0x92, 0x98,
	0x45, 0xb3, 0x21, 0x7f, 0x7c, 0x0d, 0x8f, 0x7b, 0xdf, 0x35, 0xd0, 0x99, 0xdb, 0x25, 0xfa, 0xb7,
	0x69, 0xaf, 0x75, 0xf8, 0x77, 0x94, 0x97, 0x1b, 0xd5, 0xde, 0x7a, 0x7b, 0x87, 0xb6, 0x99, 0x30,
	0x1a, 0xd9, 0xb5, 0xc6, 0x5a, 0x19, 0x5f, 0xbd, 0x3c, 0xce, 0x6a, 0xe1, 0xfe, 0xb8, 0xd5, 0xad,
	0x7f, 0x3f, 0x82, 0x7a, 0x9f, 0xb1, 0xcf, 0xa0, 0xdd, 0x2f, 0xa2, 0x98, 0x74, 0xa8, 0x80, 0x39,
	0x9a, 0x12, 0x94, 0x6f, 0xed, 0xbe, 0x4a, 0x3e, 0x65, 0xd2, 0xa5, 0x15, 0x9f, 0x4e, 0x49, 0xea,
	0xf9, 0x9f, 0xa0, 0x53, 0x0c, 0x29, 0x65, 0xd2, 0x51, 0x5a, 0x29, 0x28, 0x9d, 0x12, 0x4a, 0xbd,
	0xe6, 0xfd, 0xd4, 0x17, 0x23, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0xb4, 0x06, 0xdb, 0xc3,
	0x01, 0x00, 0x00,
}
