// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/services/campaign_criterion_simulation_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/v2/resources"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
)

// 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
// [CampaignCriterionSimulationService.GetCampaignCriterionSimulation][google.ads.googleads.v2.services.CampaignCriterionSimulationService.GetCampaignCriterionSimulation].
type GetCampaignCriterionSimulationRequest struct {
	// The resource name of the campaign criterion simulation 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 *GetCampaignCriterionSimulationRequest) Reset()         { *m = GetCampaignCriterionSimulationRequest{} }
func (m *GetCampaignCriterionSimulationRequest) String() string { return proto.CompactTextString(m) }
func (*GetCampaignCriterionSimulationRequest) ProtoMessage()    {}
func (*GetCampaignCriterionSimulationRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_3f54ecc440a25401, []int{0}
}

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

var xxx_messageInfo_GetCampaignCriterionSimulationRequest proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*GetCampaignCriterionSimulationRequest)(nil), "google.ads.googleads.v2.services.GetCampaignCriterionSimulationRequest")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/services/campaign_criterion_simulation_service.proto", fileDescriptor_3f54ecc440a25401)
}

var fileDescriptor_3f54ecc440a25401 = []byte{
	// 399 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0xaa, 0xd3, 0x40,
	0x14, 0xc6, 0x49, 0x04, 0xc1, 0xa0, 0x9b, 0x6c, 0x2c, 0x51, 0xa4, 0xd4, 0x8a, 0xd2, 0xc5, 0x0c,
	0xc4, 0xdd, 0x88, 0xc5, 0xb4, 0x68, 0x5c, 0x14, 0x29, 0x2d, 0x74, 0x21, 0x81, 0x32, 0x26, 0x43,
	0x18, 0x48, 0x66, 0xe2, 0x9c, 0x49, 0x37, 0xe2, 0xc6, 0x07, 0x70, 0xe3, 0x1b, 0xb8, 0x74, 0xef,
	0x4b, 0x74, 0xeb, 0x2b, 0xb8, 0x72, 0xe7, 0x1b, 0x48, 0x32, 0x99, 0xd4, 0x0b, 0xb7, 0xcd, 0xdd,
	0x7d, 0xcc, 0xf9, 0xf8, 0x7d, 0xe7, 0xcf, 0x78, 0xab, 0x5c, 0xca, 0xbc, 0x60, 0x98, 0x66, 0x80,
	0x8d, 0x6c, 0xd4, 0x21, 0xc4, 0xc0, 0xd4, 0x81, 0xa7, 0x0c, 0x70, 0x4a, 0xcb, 0x8a, 0xf2, 0x5c,
	0xec, 0x53, 0xc5, 0x35, 0x53, 0x5c, 0x8a, 0x3d, 0xf0, 0xb2, 0x2e, 0xa8, 0x6e, 0xa5, 0xb1, 0xa1,
	0x4a, 0x49, 0x2d, 0xfd, 0xb1, 0x41, 0x20, 0x9a, 0x01, 0xea, 0x69, 0xe8, 0x10, 0x22, 0x4b, 0x0b,
	0x5e, 0x9f, 0xcb, 0x53, 0x0c, 0x64, 0xad, 0x06, 0x03, 0x4d, 0x50, 0xf0, 0xd0, 0x62, 0x2a, 0x8e,
	0xa9, 0x10, 0x52, 0xb7, 0x45, 0xe8, 0xaa, 0xf7, 0xff, 0xab, 0xa6, 0x05, 0x67, 0x42, 0x9b, 0xc2,
	0x64, 0xe5, 0x3d, 0x89, 0x99, 0x5e, 0x76, 0x01, 0x4b, 0xcb, 0xdf, 0xf6, 0xf8, 0x0d, 0xfb, 0x58,
	0x33, 0xd0, 0xfe, 0x63, 0xef, 0x9e, 0x6d, 0x68, 0x2f, 0x68, 0xc9, 0x46, 0xce, 0xd8, 0x79, 0x76,
	0x67, 0x73, 0xd7, 0x3e, 0xbe, 0xa3, 0x25, 0x0b, 0x7f, 0xba, 0xde, 0xe4, 0x02, 0x6b, 0x6b, 0x66,
	0xf6, 0xff, 0x3a, 0xde, 0xa3, 0xcb, 0xa9, 0x7e, 0x8c, 0x86, 0x16, 0x87, 0x6e, 0xd4, 0x77, 0x30,
	0x3f, 0x0b, 0xea, 0xf7, 0x8b, 0x2e, 0x60, 0x26, 0x6f, 0xbe, 0xfc, 0xfa, 0xfd, 0xcd, 0x7d, 0xe5,
	0xcf, 0x9b, 0x93, 0x7c, 0xba, 0xb2, 0x82, 0x97, 0x69, 0x0d, 0x5a, 0x96, 0x4c, 0x01, 0x9e, 0xf5,
	0x37, 0xba, 0x86, 0x01, 0x78, 0xf6, 0x39, 0x78, 0x70, 0x8c, 0x46, 0xa7, 0xf8, 0x4e, 0x55, 0x1c,
	0x50, 0x2a, 0xcb, 0xc5, 0x57, 0xd7, 0x9b, 0xa6, 0xb2, 0x1c, 0x9c, 0x79, 0xf1, 0x74, 0x78, 0xbb,
	0xeb, 0xe6, 0xae, 0x6b, 0xe7, 0xfd, 0xdb, 0x0e, 0x96, 0xcb, 0x82, 0x8a, 0x1c, 0x49, 0x95, 0xe3,
	0x9c, 0x89, 0xf6, 0xea, 0xf8, 0x14, 0x7f, 0xfe, 0x9b, 0xbf, 0xb0, 0xe2, 0xbb, 0x7b, 0x2b, 0x8e,
	0xa2, 0x1f, 0xee, 0x38, 0x36, 0xc0, 0x28, 0x03, 0x64, 0x64, 0xa3, 0x76, 0x21, 0xea, 0x82, 0xe1,
	0x68, 0x2d, 0x49, 0x94, 0x41, 0xd2, 0x5b, 0x92, 0x5d, 0x98, 0x58, 0xcb, 0x1f, 0x77, 0x6a, 0xde,
	0x09, 0x89, 0x32, 0x20, 0xa4, 0x37, 0x11, 0xb2, 0x0b, 0x09, 0xb1, 0xb6, 0x0f, 0xb7, 0xdb, 0x3e,
	0x9f, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x6b, 0xa6, 0x32, 0x8d, 0x03, 0x00, 0x00,
}

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

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

// CampaignCriterionSimulationServiceClient is the client API for CampaignCriterionSimulationService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type CampaignCriterionSimulationServiceClient interface {
	// Returns the requested campaign criterion simulation in full detail.
	GetCampaignCriterionSimulation(ctx context.Context, in *GetCampaignCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.CampaignCriterionSimulation, error)
}

type campaignCriterionSimulationServiceClient struct {
	cc *grpc.ClientConn
}

func NewCampaignCriterionSimulationServiceClient(cc *grpc.ClientConn) CampaignCriterionSimulationServiceClient {
	return &campaignCriterionSimulationServiceClient{cc}
}

func (c *campaignCriterionSimulationServiceClient) GetCampaignCriterionSimulation(ctx context.Context, in *GetCampaignCriterionSimulationRequest, opts ...grpc.CallOption) (*resources.CampaignCriterionSimulation, error) {
	out := new(resources.CampaignCriterionSimulation)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v2.services.CampaignCriterionSimulationService/GetCampaignCriterionSimulation", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// CampaignCriterionSimulationServiceServer is the server API for CampaignCriterionSimulationService service.
type CampaignCriterionSimulationServiceServer interface {
	// Returns the requested campaign criterion simulation in full detail.
	GetCampaignCriterionSimulation(context.Context, *GetCampaignCriterionSimulationRequest) (*resources.CampaignCriterionSimulation, error)
}

func RegisterCampaignCriterionSimulationServiceServer(s *grpc.Server, srv CampaignCriterionSimulationServiceServer) {
	s.RegisterService(&_CampaignCriterionSimulationService_serviceDesc, srv)
}

func _CampaignCriterionSimulationService_GetCampaignCriterionSimulation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetCampaignCriterionSimulationRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(CampaignCriterionSimulationServiceServer).GetCampaignCriterionSimulation(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v2.services.CampaignCriterionSimulationService/GetCampaignCriterionSimulation",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(CampaignCriterionSimulationServiceServer).GetCampaignCriterionSimulation(ctx, req.(*GetCampaignCriterionSimulationRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _CampaignCriterionSimulationService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v2.services.CampaignCriterionSimulationService",
	HandlerType: (*CampaignCriterionSimulationServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetCampaignCriterionSimulation",
			Handler:    _CampaignCriterionSimulationService_GetCampaignCriterionSimulation_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v2/services/campaign_criterion_simulation_service.proto",
}
