// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/dynamic_search_ads_search_term_view_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"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "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
// [DynamicSearchAdsSearchTermViewService.GetDynamicSearchAdsSearchTermView][google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService.GetDynamicSearchAdsSearchTermView].
type GetDynamicSearchAdsSearchTermViewRequest struct {
	// Required. The resource name of the dynamic search ads search term view 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 *GetDynamicSearchAdsSearchTermViewRequest) Reset() {
	*m = GetDynamicSearchAdsSearchTermViewRequest{}
}
func (m *GetDynamicSearchAdsSearchTermViewRequest) String() string { return proto.CompactTextString(m) }
func (*GetDynamicSearchAdsSearchTermViewRequest) ProtoMessage()    {}
func (*GetDynamicSearchAdsSearchTermViewRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c06f8b0bac521385, []int{0}
}

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

var xxx_messageInfo_GetDynamicSearchAdsSearchTermViewRequest proto.InternalMessageInfo

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

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

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

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

// DynamicSearchAdsSearchTermViewServiceClient is the client API for DynamicSearchAdsSearchTermViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type DynamicSearchAdsSearchTermViewServiceClient interface {
	// Returns the requested dynamic search ads search term view in full detail.
	GetDynamicSearchAdsSearchTermView(ctx context.Context, in *GetDynamicSearchAdsSearchTermViewRequest, opts ...grpc.CallOption) (*resources.DynamicSearchAdsSearchTermView, error)
}

type dynamicSearchAdsSearchTermViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewDynamicSearchAdsSearchTermViewServiceClient(cc grpc.ClientConnInterface) DynamicSearchAdsSearchTermViewServiceClient {
	return &dynamicSearchAdsSearchTermViewServiceClient{cc}
}

func (c *dynamicSearchAdsSearchTermViewServiceClient) GetDynamicSearchAdsSearchTermView(ctx context.Context, in *GetDynamicSearchAdsSearchTermViewRequest, opts ...grpc.CallOption) (*resources.DynamicSearchAdsSearchTermView, error) {
	out := new(resources.DynamicSearchAdsSearchTermView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService/GetDynamicSearchAdsSearchTermView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// DynamicSearchAdsSearchTermViewServiceServer is the server API for DynamicSearchAdsSearchTermViewService service.
type DynamicSearchAdsSearchTermViewServiceServer interface {
	// Returns the requested dynamic search ads search term view in full detail.
	GetDynamicSearchAdsSearchTermView(context.Context, *GetDynamicSearchAdsSearchTermViewRequest) (*resources.DynamicSearchAdsSearchTermView, error)
}

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

func (*UnimplementedDynamicSearchAdsSearchTermViewServiceServer) GetDynamicSearchAdsSearchTermView(ctx context.Context, req *GetDynamicSearchAdsSearchTermViewRequest) (*resources.DynamicSearchAdsSearchTermView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetDynamicSearchAdsSearchTermView not implemented")
}

func RegisterDynamicSearchAdsSearchTermViewServiceServer(s *grpc.Server, srv DynamicSearchAdsSearchTermViewServiceServer) {
	s.RegisterService(&_DynamicSearchAdsSearchTermViewService_serviceDesc, srv)
}

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

var _DynamicSearchAdsSearchTermViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.DynamicSearchAdsSearchTermViewService",
	HandlerType: (*DynamicSearchAdsSearchTermViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetDynamicSearchAdsSearchTermView",
			Handler:    _DynamicSearchAdsSearchTermViewService_GetDynamicSearchAdsSearchTermView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/dynamic_search_ads_search_term_view_service.proto",
}
