// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/customer_extension_setting_service.proto

package services

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	status "google.golang.org/genproto/googleapis/rpc/status"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status1 "google.golang.org/grpc/status"
)

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

// Request message for
// [CustomerExtensionSettingService.GetCustomerExtensionSetting][google.ads.googleads.v3.services.CustomerExtensionSettingService.GetCustomerExtensionSetting].
type GetCustomerExtensionSettingRequest struct {
	// Required. The resource name of the customer extension setting to fetch.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetCustomerExtensionSettingRequest proto.InternalMessageInfo

func (m *GetCustomerExtensionSettingRequest) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

// Request message for
// [CustomerExtensionSettingService.MutateCustomerExtensionSettings][google.ads.googleads.v3.services.CustomerExtensionSettingService.MutateCustomerExtensionSettings].
type MutateCustomerExtensionSettingsRequest struct {
	// Required. The ID of the customer whose customer extension settings are being
	// modified.
	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
	// Required. The list of operations to perform on individual customer extension
	// settings.
	Operations []*CustomerExtensionSettingOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
	// If true, successful operations will be carried out and invalid
	// operations will return errors. If false, all operations will be carried
	// out in one transaction if and only if they are all valid.
	// Default is false.
	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
	// If true, the request is validated but not executed. Only errors are
	// returned, not results.
	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MutateCustomerExtensionSettingsRequest) Reset() {
	*m = MutateCustomerExtensionSettingsRequest{}
}
func (m *MutateCustomerExtensionSettingsRequest) String() string { return proto.CompactTextString(m) }
func (*MutateCustomerExtensionSettingsRequest) ProtoMessage()    {}
func (*MutateCustomerExtensionSettingsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_56ee6b2d7db0d86b, []int{1}
}

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

var xxx_messageInfo_MutateCustomerExtensionSettingsRequest proto.InternalMessageInfo

func (m *MutateCustomerExtensionSettingsRequest) GetCustomerId() string {
	if m != nil {
		return m.CustomerId
	}
	return ""
}

func (m *MutateCustomerExtensionSettingsRequest) GetOperations() []*CustomerExtensionSettingOperation {
	if m != nil {
		return m.Operations
	}
	return nil
}

func (m *MutateCustomerExtensionSettingsRequest) GetPartialFailure() bool {
	if m != nil {
		return m.PartialFailure
	}
	return false
}

func (m *MutateCustomerExtensionSettingsRequest) GetValidateOnly() bool {
	if m != nil {
		return m.ValidateOnly
	}
	return false
}

// A single operation (create, update, remove) on a customer extension setting.
type CustomerExtensionSettingOperation struct {
	// FieldMask that determines which resource fields are modified in an update.
	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	// The mutate operation.
	//
	// Types that are valid to be assigned to Operation:
	//	*CustomerExtensionSettingOperation_Create
	//	*CustomerExtensionSettingOperation_Update
	//	*CustomerExtensionSettingOperation_Remove
	Operation            isCustomerExtensionSettingOperation_Operation `protobuf_oneof:"operation"`
	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
	XXX_unrecognized     []byte                                        `json:"-"`
	XXX_sizecache        int32                                         `json:"-"`
}

func (m *CustomerExtensionSettingOperation) Reset()         { *m = CustomerExtensionSettingOperation{} }
func (m *CustomerExtensionSettingOperation) String() string { return proto.CompactTextString(m) }
func (*CustomerExtensionSettingOperation) ProtoMessage()    {}
func (*CustomerExtensionSettingOperation) Descriptor() ([]byte, []int) {
	return fileDescriptor_56ee6b2d7db0d86b, []int{2}
}

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

var xxx_messageInfo_CustomerExtensionSettingOperation proto.InternalMessageInfo

func (m *CustomerExtensionSettingOperation) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

type isCustomerExtensionSettingOperation_Operation interface {
	isCustomerExtensionSettingOperation_Operation()
}

type CustomerExtensionSettingOperation_Create struct {
	Create *resources.CustomerExtensionSetting `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
}

type CustomerExtensionSettingOperation_Update struct {
	Update *resources.CustomerExtensionSetting `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
}

type CustomerExtensionSettingOperation_Remove struct {
	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
}

func (*CustomerExtensionSettingOperation_Create) isCustomerExtensionSettingOperation_Operation() {}

func (*CustomerExtensionSettingOperation_Update) isCustomerExtensionSettingOperation_Operation() {}

func (*CustomerExtensionSettingOperation_Remove) isCustomerExtensionSettingOperation_Operation() {}

func (m *CustomerExtensionSettingOperation) GetOperation() isCustomerExtensionSettingOperation_Operation {
	if m != nil {
		return m.Operation
	}
	return nil
}

func (m *CustomerExtensionSettingOperation) GetCreate() *resources.CustomerExtensionSetting {
	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Create); ok {
		return x.Create
	}
	return nil
}

func (m *CustomerExtensionSettingOperation) GetUpdate() *resources.CustomerExtensionSetting {
	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Update); ok {
		return x.Update
	}
	return nil
}

func (m *CustomerExtensionSettingOperation) GetRemove() string {
	if x, ok := m.GetOperation().(*CustomerExtensionSettingOperation_Remove); ok {
		return x.Remove
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CustomerExtensionSettingOperation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CustomerExtensionSettingOperation_Create)(nil),
		(*CustomerExtensionSettingOperation_Update)(nil),
		(*CustomerExtensionSettingOperation_Remove)(nil),
	}
}

// Response message for a customer extension setting mutate.
type MutateCustomerExtensionSettingsResponse struct {
	// Errors that pertain to operation failures in the partial failure mode.
	// Returned only when partial_failure = true and all errors occur inside the
	// operations. If any errors occur outside the operations (e.g. auth errors),
	// we return an RPC level error.
	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
	// All results for the mutate.
	Results              []*MutateCustomerExtensionSettingResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *MutateCustomerExtensionSettingsResponse) Reset() {
	*m = MutateCustomerExtensionSettingsResponse{}
}
func (m *MutateCustomerExtensionSettingsResponse) String() string { return proto.CompactTextString(m) }
func (*MutateCustomerExtensionSettingsResponse) ProtoMessage()    {}
func (*MutateCustomerExtensionSettingsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_56ee6b2d7db0d86b, []int{3}
}

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

var xxx_messageInfo_MutateCustomerExtensionSettingsResponse proto.InternalMessageInfo

func (m *MutateCustomerExtensionSettingsResponse) GetPartialFailureError() *status.Status {
	if m != nil {
		return m.PartialFailureError
	}
	return nil
}

func (m *MutateCustomerExtensionSettingsResponse) GetResults() []*MutateCustomerExtensionSettingResult {
	if m != nil {
		return m.Results
	}
	return nil
}

// The result for the customer extension setting mutate.
type MutateCustomerExtensionSettingResult struct {
	// Returned for successful operations.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MutateCustomerExtensionSettingResult) Reset()         { *m = MutateCustomerExtensionSettingResult{} }
func (m *MutateCustomerExtensionSettingResult) String() string { return proto.CompactTextString(m) }
func (*MutateCustomerExtensionSettingResult) ProtoMessage()    {}
func (*MutateCustomerExtensionSettingResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_56ee6b2d7db0d86b, []int{4}
}

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

var xxx_messageInfo_MutateCustomerExtensionSettingResult proto.InternalMessageInfo

func (m *MutateCustomerExtensionSettingResult) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*GetCustomerExtensionSettingRequest)(nil), "google.ads.googleads.v3.services.GetCustomerExtensionSettingRequest")
	proto.RegisterType((*MutateCustomerExtensionSettingsRequest)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingsRequest")
	proto.RegisterType((*CustomerExtensionSettingOperation)(nil), "google.ads.googleads.v3.services.CustomerExtensionSettingOperation")
	proto.RegisterType((*MutateCustomerExtensionSettingsResponse)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingsResponse")
	proto.RegisterType((*MutateCustomerExtensionSettingResult)(nil), "google.ads.googleads.v3.services.MutateCustomerExtensionSettingResult")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/services/customer_extension_setting_service.proto", fileDescriptor_56ee6b2d7db0d86b)
}

var fileDescriptor_56ee6b2d7db0d86b = []byte{
	// 776 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xbf, 0x6f, 0xdb, 0x46,
	0x14, 0xae, 0x28, 0xc3, 0xad, 0x4f, 0x76, 0x0b, 0x5c, 0xd1, 0x56, 0x90, 0x0b, 0x58, 0x65, 0x85,
	0x5a, 0x10, 0x0a, 0x12, 0x90, 0x36, 0x0a, 0x2e, 0x40, 0xb9, 0x96, 0x6d, 0x14, 0xfe, 0x01, 0x0a,
	0xf5, 0x50, 0x08, 0x60, 0x4f, 0xe4, 0x59, 0x26, 0x4c, 0xf2, 0x98, 0xbb, 0xa3, 0x10, 0xc3, 0xf0,
	0x92, 0x21, 0x4b, 0xc6, 0x6c, 0x19, 0x33, 0x66, 0xcf, 0x3f, 0xe1, 0xd5, 0x9b, 0xa7, 0x0c, 0x99,
	0xb2, 0x67, 0x0f, 0xc8, 0xe3, 0xe9, 0x87, 0x13, 0x9a, 0x01, 0xec, 0xed, 0xe9, 0xde, 0xc7, 0xef,
	0x7d, 0xf7, 0xde, 0x77, 0x4f, 0x60, 0x7f, 0x4c, 0xc8, 0xd8, 0xc7, 0x3a, 0x72, 0x99, 0x2e, 0xc2,
	0x24, 0x9a, 0x74, 0x74, 0x86, 0xe9, 0xc4, 0x73, 0x30, 0xd3, 0x9d, 0x98, 0x71, 0x12, 0x60, 0x6a,
	0xe3, 0xa7, 0x1c, 0x87, 0xcc, 0x23, 0xa1, 0xcd, 0x30, 0xe7, 0x5e, 0x38, 0xb6, 0x33, 0x8c, 0x16,
	0x51, 0xc2, 0x09, 0xac, 0x8b, 0xef, 0x35, 0xe4, 0x32, 0x6d, 0x4a, 0xa5, 0x4d, 0x3a, 0x9a, 0xa4,
	0xaa, 0xf5, 0xf2, 0x8a, 0x51, 0xcc, 0x48, 0x4c, 0xef, 0xaf, 0x26, 0xaa, 0xd4, 0x7e, 0x95, 0x1c,
	0x91, 0xa7, 0xa3, 0x30, 0x24, 0x1c, 0x71, 0x8f, 0x84, 0x2c, 0xcb, 0xfe, 0x32, 0x97, 0x75, 0x7c,
	0x0f, 0x87, 0x3c, 0x4b, 0x6c, 0xcc, 0x25, 0x4e, 0x3d, 0xec, 0xbb, 0xf6, 0x08, 0x9f, 0xa1, 0x89,
	0x47, 0x68, 0x06, 0xc8, 0xd4, 0xeb, 0xe9, 0xaf, 0x51, 0x7c, 0x9a, 0xa1, 0x02, 0xc4, 0xce, 0xef,
	0x70, 0xd3, 0xc8, 0xd1, 0x19, 0x47, 0x3c, 0xce, 0x8a, 0xaa, 0x87, 0x40, 0xdd, 0xc5, 0x7c, 0x3b,
	0x53, 0xbe, 0x23, 0x85, 0x0f, 0x84, 0x6e, 0x0b, 0x3f, 0x89, 0x31, 0xe3, 0xb0, 0x09, 0xd6, 0xe4,
	0x35, 0xed, 0x10, 0x05, 0xb8, 0x5a, 0xaa, 0x97, 0x9a, 0x2b, 0xbd, 0xf2, 0x3b, 0x53, 0xb1, 0x56,
	0x65, 0xe6, 0x10, 0x05, 0x58, 0x7d, 0xae, 0x80, 0x3f, 0x0e, 0x62, 0x8e, 0x38, 0xce, 0xe3, 0x64,
	0x92, 0xb4, 0x01, 0x2a, 0xd3, 0x8e, 0x79, 0xee, 0x3c, 0x25, 0x90, 0xe7, 0xfb, 0x2e, 0x3c, 0x03,
	0x80, 0x44, 0x98, 0x8a, 0x4e, 0x55, 0x95, 0x7a, 0xb9, 0x59, 0x69, 0x6f, 0x6b, 0x45, 0xe3, 0xd2,
	0xf2, 0xaa, 0x1f, 0x49, 0xae, 0xac, 0xd2, 0x8c, 0x1b, 0x6e, 0x82, 0x1f, 0x22, 0x44, 0xb9, 0x87,
	0x7c, 0xfb, 0x14, 0x79, 0x7e, 0x4c, 0x71, 0xb5, 0x5c, 0x2f, 0x35, 0xbf, 0xb3, 0xbe, 0xcf, 0x8e,
	0xfb, 0xe2, 0x14, 0xfe, 0x0e, 0xd6, 0x26, 0xc8, 0xf7, 0x5c, 0xc4, 0xb1, 0x4d, 0x42, 0xff, 0xa2,
	0xba, 0x94, 0xc2, 0x56, 0xe5, 0xe1, 0x51, 0xe8, 0x5f, 0xa8, 0x6f, 0x15, 0xf0, 0x5b, 0xa1, 0x08,
	0xd8, 0x05, 0x95, 0x38, 0x4a, 0x89, 0x92, 0x61, 0xa5, 0x44, 0x95, 0x76, 0x4d, 0x5e, 0x4f, 0xce,
	0x53, 0xeb, 0x27, 0xf3, 0x3c, 0x40, 0xec, 0xdc, 0x02, 0x02, 0x9e, 0xc4, 0xf0, 0x5f, 0xb0, 0xec,
	0x50, 0x8c, 0xb8, 0x18, 0x47, 0xa5, 0xdd, 0xcd, 0x6d, 0xcb, 0xd4, 0xa3, 0xb9, 0x7d, 0xd9, 0xfb,
	0xc6, 0xca, 0xc8, 0x12, 0x5a, 0x51, 0xa4, 0xaa, 0x3c, 0x0a, 0xad, 0x20, 0x83, 0x55, 0xb0, 0x4c,
	0x71, 0x40, 0x26, 0xa2, 0xab, 0x2b, 0x49, 0x46, 0xfc, 0xee, 0x55, 0xc0, 0xca, 0x74, 0x0c, 0xea,
	0x4d, 0x09, 0x6c, 0x16, 0x1a, 0x88, 0x45, 0x24, 0x64, 0x18, 0xf6, 0xc1, 0x4f, 0x77, 0x26, 0x66,
	0x63, 0x4a, 0x09, 0x4d, 0x2b, 0x54, 0xda, 0x50, 0x0a, 0xa7, 0x91, 0xa3, 0x0d, 0x52, 0xd7, 0x5b,
	0x3f, 0x2e, 0xce, 0x72, 0x27, 0x81, 0xc3, 0xff, 0xc1, 0xb7, 0x14, 0xb3, 0xd8, 0xe7, 0xd2, 0x60,
	0xfd, 0x62, 0x83, 0xdd, 0xaf, 0xd1, 0x4a, 0xe9, 0x2c, 0x49, 0xab, 0xfe, 0x03, 0x1a, 0x5f, 0xf3,
	0x41, 0x62, 0xad, 0x2f, 0x3c, 0xb4, 0xc5, 0x37, 0xd6, 0xbe, 0x59, 0x02, 0x1b, 0x79, 0x3c, 0x03,
	0xa1, 0x0f, 0x7e, 0x2c, 0x81, 0xf5, 0x7b, 0x1e, 0x36, 0xfc, 0xbb, 0xf8, 0x86, 0xc5, 0x7b, 0xa1,
	0xf6, 0x10, 0x6b, 0xa8, 0x83, 0x5b, 0x73, 0xf1, 0xb2, 0xcf, 0x6e, 0xde, 0xbf, 0x54, 0xb6, 0x60,
	0x37, 0xd9, 0xaa, 0x97, 0x0b, 0x99, 0x2d, 0xb9, 0x10, 0x98, 0xde, 0x9a, 0xae, 0xd9, 0xcf, 0x7c,
	0xa1, 0xb7, 0xae, 0xe0, 0x2b, 0x05, 0x6c, 0x14, 0xd8, 0x07, 0xee, 0x3d, 0x74, 0xba, 0x72, 0x85,
	0xd5, 0xf6, 0x1f, 0x81, 0x49, 0x78, 0x59, 0x1d, 0xdd, 0x9a, 0x3f, 0xcf, 0xad, 0xc3, 0x3f, 0x67,
	0x8b, 0x29, 0x6d, 0xcb, 0xb6, 0xfa, 0x57, 0xd2, 0x96, 0x59, 0x1f, 0x2e, 0xe7, 0xc0, 0x5b, 0xad,
	0xab, 0xfc, 0xae, 0x18, 0x41, 0xaa, 0xc0, 0x28, 0xb5, 0x6a, 0xeb, 0xd7, 0x66, 0x75, 0xa6, 0x32,
	0x8b, 0x22, 0x8f, 0x69, 0x0e, 0x09, 0x7a, 0x2f, 0x14, 0xd0, 0x70, 0x48, 0x50, 0x78, 0xa3, 0x5e,
	0xa3, 0xc0, 0x7b, 0xc7, 0xc9, 0xd6, 0x3a, 0x2e, 0xfd, 0xb7, 0x97, 0x31, 0x8d, 0x89, 0x8f, 0xc2,
	0xb1, 0x46, 0xe8, 0x58, 0x1f, 0xe3, 0x30, 0xdd, 0x69, 0xfa, 0xac, 0x76, 0xfe, 0xbf, 0x77, 0x57,
	0x06, 0xaf, 0x95, 0xf2, 0xae, 0x69, 0xbe, 0x51, 0xea, 0xbb, 0x82, 0xd0, 0x74, 0x99, 0x26, 0xc2,
	0x24, 0x3a, 0xe9, 0x68, 0x59, 0x61, 0x76, 0x2d, 0x21, 0x43, 0xd3, 0x65, 0xc3, 0x29, 0x64, 0x78,
	0xd2, 0x19, 0x4a, 0xc8, 0x07, 0xa5, 0x21, 0xce, 0x0d, 0xc3, 0x74, 0x99, 0x61, 0x4c, 0x41, 0x86,
	0x71, 0xd2, 0x31, 0x0c, 0x09, 0x1b, 0x2d, 0xa7, 0x3a, 0x3b, 0x9f, 0x02, 0x00, 0x00, 0xff, 0xff,
	0xd4, 0xf0, 0x94, 0xc1, 0x64, 0x08, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// CustomerExtensionSettingServiceClient is the client API for CustomerExtensionSettingService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type CustomerExtensionSettingServiceClient interface {
	// Returns the requested customer extension setting in full detail.
	GetCustomerExtensionSetting(ctx context.Context, in *GetCustomerExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CustomerExtensionSetting, error)
	// Creates, updates, or removes customer extension settings. Operation
	// statuses are returned.
	MutateCustomerExtensionSettings(ctx context.Context, in *MutateCustomerExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCustomerExtensionSettingsResponse, error)
}

type customerExtensionSettingServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewCustomerExtensionSettingServiceClient(cc grpc.ClientConnInterface) CustomerExtensionSettingServiceClient {
	return &customerExtensionSettingServiceClient{cc}
}

func (c *customerExtensionSettingServiceClient) GetCustomerExtensionSetting(ctx context.Context, in *GetCustomerExtensionSettingRequest, opts ...grpc.CallOption) (*resources.CustomerExtensionSetting, error) {
	out := new(resources.CustomerExtensionSetting)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerExtensionSettingService/GetCustomerExtensionSetting", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *customerExtensionSettingServiceClient) MutateCustomerExtensionSettings(ctx context.Context, in *MutateCustomerExtensionSettingsRequest, opts ...grpc.CallOption) (*MutateCustomerExtensionSettingsResponse, error) {
	out := new(MutateCustomerExtensionSettingsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.CustomerExtensionSettingService/MutateCustomerExtensionSettings", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// CustomerExtensionSettingServiceServer is the server API for CustomerExtensionSettingService service.
type CustomerExtensionSettingServiceServer interface {
	// Returns the requested customer extension setting in full detail.
	GetCustomerExtensionSetting(context.Context, *GetCustomerExtensionSettingRequest) (*resources.CustomerExtensionSetting, error)
	// Creates, updates, or removes customer extension settings. Operation
	// statuses are returned.
	MutateCustomerExtensionSettings(context.Context, *MutateCustomerExtensionSettingsRequest) (*MutateCustomerExtensionSettingsResponse, error)
}

// UnimplementedCustomerExtensionSettingServiceServer can be embedded to have forward compatible implementations.
type UnimplementedCustomerExtensionSettingServiceServer struct {
}

func (*UnimplementedCustomerExtensionSettingServiceServer) GetCustomerExtensionSetting(ctx context.Context, req *GetCustomerExtensionSettingRequest) (*resources.CustomerExtensionSetting, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetCustomerExtensionSetting not implemented")
}
func (*UnimplementedCustomerExtensionSettingServiceServer) MutateCustomerExtensionSettings(ctx context.Context, req *MutateCustomerExtensionSettingsRequest) (*MutateCustomerExtensionSettingsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method MutateCustomerExtensionSettings not implemented")
}

func RegisterCustomerExtensionSettingServiceServer(s *grpc.Server, srv CustomerExtensionSettingServiceServer) {
	s.RegisterService(&_CustomerExtensionSettingService_serviceDesc, srv)
}

func _CustomerExtensionSettingService_GetCustomerExtensionSetting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetCustomerExtensionSettingRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CustomerExtensionSettingServiceServer).GetCustomerExtensionSetting(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.CustomerExtensionSettingService/GetCustomerExtensionSetting",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CustomerExtensionSettingServiceServer).GetCustomerExtensionSetting(ctx, req.(*GetCustomerExtensionSettingRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _CustomerExtensionSettingService_MutateCustomerExtensionSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MutateCustomerExtensionSettingsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CustomerExtensionSettingServiceServer).MutateCustomerExtensionSettings(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.CustomerExtensionSettingService/MutateCustomerExtensionSettings",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CustomerExtensionSettingServiceServer).MutateCustomerExtensionSettings(ctx, req.(*MutateCustomerExtensionSettingsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _CustomerExtensionSettingService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.CustomerExtensionSettingService",
	HandlerType: (*CustomerExtensionSettingServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetCustomerExtensionSetting",
			Handler:    _CustomerExtensionSettingService_GetCustomerExtensionSetting_Handler,
		},
		{
			MethodName: "MutateCustomerExtensionSettings",
			Handler:    _CustomerExtensionSettingService_MutateCustomerExtensionSettings_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/customer_extension_setting_service.proto",
}
