// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/remarketing_action_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 [RemarketingActionService.GetRemarketingAction][google.ads.googleads.v3.services.RemarketingActionService.GetRemarketingAction].
type GetRemarketingActionRequest struct {
	// Required. The resource name of the remarketing action 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 *GetRemarketingActionRequest) Reset()         { *m = GetRemarketingActionRequest{} }
func (m *GetRemarketingActionRequest) String() string { return proto.CompactTextString(m) }
func (*GetRemarketingActionRequest) ProtoMessage()    {}
func (*GetRemarketingActionRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_890528f85438186a, []int{0}
}

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

var xxx_messageInfo_GetRemarketingActionRequest proto.InternalMessageInfo

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

// Request message for [RemarketingActionService.MutateRemarketingActions][google.ads.googleads.v3.services.RemarketingActionService.MutateRemarketingActions].
type MutateRemarketingActionsRequest struct {
	// Required. The ID of the customer whose remarketing actions 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 remarketing actions.
	Operations []*RemarketingActionOperation `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 *MutateRemarketingActionsRequest) Reset()         { *m = MutateRemarketingActionsRequest{} }
func (m *MutateRemarketingActionsRequest) String() string { return proto.CompactTextString(m) }
func (*MutateRemarketingActionsRequest) ProtoMessage()    {}
func (*MutateRemarketingActionsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_890528f85438186a, []int{1}
}

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

var xxx_messageInfo_MutateRemarketingActionsRequest proto.InternalMessageInfo

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

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

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

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

// A single operation (create, update) on a remarketing action.
type RemarketingActionOperation 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:
	//	*RemarketingActionOperation_Create
	//	*RemarketingActionOperation_Update
	Operation            isRemarketingActionOperation_Operation `protobuf_oneof:"operation"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_RemarketingActionOperation proto.InternalMessageInfo

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

type isRemarketingActionOperation_Operation interface {
	isRemarketingActionOperation_Operation()
}

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

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

func (*RemarketingActionOperation_Create) isRemarketingActionOperation_Operation() {}

func (*RemarketingActionOperation_Update) isRemarketingActionOperation_Operation() {}

func (m *RemarketingActionOperation) GetOperation() isRemarketingActionOperation_Operation {
	if m != nil {
		return m.Operation
	}
	return nil
}

func (m *RemarketingActionOperation) GetCreate() *resources.RemarketingAction {
	if x, ok := m.GetOperation().(*RemarketingActionOperation_Create); ok {
		return x.Create
	}
	return nil
}

func (m *RemarketingActionOperation) GetUpdate() *resources.RemarketingAction {
	if x, ok := m.GetOperation().(*RemarketingActionOperation_Update); ok {
		return x.Update
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RemarketingActionOperation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RemarketingActionOperation_Create)(nil),
		(*RemarketingActionOperation_Update)(nil),
	}
}

// Response message for remarketing action mutate.
type MutateRemarketingActionsResponse 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              []*MutateRemarketingActionResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

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

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

var xxx_messageInfo_MutateRemarketingActionsResponse proto.InternalMessageInfo

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

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

// The result for the remarketing action mutate.
type MutateRemarketingActionResult 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 *MutateRemarketingActionResult) Reset()         { *m = MutateRemarketingActionResult{} }
func (m *MutateRemarketingActionResult) String() string { return proto.CompactTextString(m) }
func (*MutateRemarketingActionResult) ProtoMessage()    {}
func (*MutateRemarketingActionResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_890528f85438186a, []int{4}
}

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

var xxx_messageInfo_MutateRemarketingActionResult proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*GetRemarketingActionRequest)(nil), "google.ads.googleads.v3.services.GetRemarketingActionRequest")
	proto.RegisterType((*MutateRemarketingActionsRequest)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionsRequest")
	proto.RegisterType((*RemarketingActionOperation)(nil), "google.ads.googleads.v3.services.RemarketingActionOperation")
	proto.RegisterType((*MutateRemarketingActionsResponse)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionsResponse")
	proto.RegisterType((*MutateRemarketingActionResult)(nil), "google.ads.googleads.v3.services.MutateRemarketingActionResult")
}

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

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

// RemarketingActionServiceClient is the client API for RemarketingActionService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type RemarketingActionServiceClient interface {
	// Returns the requested remarketing action in full detail.
	GetRemarketingAction(ctx context.Context, in *GetRemarketingActionRequest, opts ...grpc.CallOption) (*resources.RemarketingAction, error)
	// Creates or updates remarketing actions. Operation statuses are returned.
	MutateRemarketingActions(ctx context.Context, in *MutateRemarketingActionsRequest, opts ...grpc.CallOption) (*MutateRemarketingActionsResponse, error)
}

type remarketingActionServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewRemarketingActionServiceClient(cc grpc.ClientConnInterface) RemarketingActionServiceClient {
	return &remarketingActionServiceClient{cc}
}

func (c *remarketingActionServiceClient) GetRemarketingAction(ctx context.Context, in *GetRemarketingActionRequest, opts ...grpc.CallOption) (*resources.RemarketingAction, error) {
	out := new(resources.RemarketingAction)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RemarketingActionService/GetRemarketingAction", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *remarketingActionServiceClient) MutateRemarketingActions(ctx context.Context, in *MutateRemarketingActionsRequest, opts ...grpc.CallOption) (*MutateRemarketingActionsResponse, error) {
	out := new(MutateRemarketingActionsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.RemarketingActionService/MutateRemarketingActions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// RemarketingActionServiceServer is the server API for RemarketingActionService service.
type RemarketingActionServiceServer interface {
	// Returns the requested remarketing action in full detail.
	GetRemarketingAction(context.Context, *GetRemarketingActionRequest) (*resources.RemarketingAction, error)
	// Creates or updates remarketing actions. Operation statuses are returned.
	MutateRemarketingActions(context.Context, *MutateRemarketingActionsRequest) (*MutateRemarketingActionsResponse, error)
}

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

func (*UnimplementedRemarketingActionServiceServer) GetRemarketingAction(ctx context.Context, req *GetRemarketingActionRequest) (*resources.RemarketingAction, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetRemarketingAction not implemented")
}
func (*UnimplementedRemarketingActionServiceServer) MutateRemarketingActions(ctx context.Context, req *MutateRemarketingActionsRequest) (*MutateRemarketingActionsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method MutateRemarketingActions not implemented")
}

func RegisterRemarketingActionServiceServer(s *grpc.Server, srv RemarketingActionServiceServer) {
	s.RegisterService(&_RemarketingActionService_serviceDesc, srv)
}

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

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

var _RemarketingActionService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.RemarketingActionService",
	HandlerType: (*RemarketingActionServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetRemarketingAction",
			Handler:    _RemarketingActionService_GetRemarketingAction_Handler,
		},
		{
			MethodName: "MutateRemarketingActions",
			Handler:    _RemarketingActionService_MutateRemarketingActions_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/remarketing_action_service.proto",
}
