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

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

var xxx_messageInfo_GetLandingPageViewRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_0c3c342ff39fd41d = []byte{
	// 435 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x8b, 0xd4, 0x40,
	0x18, 0x25, 0x11, 0x04, 0x83, 0x36, 0x29, 0xf4, 0x2e, 0x27, 0xb8, 0x1c, 0x57, 0x1c, 0x5b, 0xcc,
	0xc8, 0xc6, 0xc6, 0x39, 0x04, 0x67, 0x9b, 0x15, 0x11, 0x59, 0x14, 0x53, 0x48, 0x20, 0xcc, 0x25,
	0x9f, 0xe3, 0x40, 0x32, 0x13, 0x67, 0xb2, 0xb9, 0x42, 0x6c, 0xae, 0xb3, 0xf6, 0x1f, 0x58, 0xfa,
	0x53, 0xae, 0x13, 0x3b, 0x2b, 0x0b, 0x2b, 0x7f, 0x82, 0x95, 0xe4, 0x26, 0x93, 0xdb, 0x5b, 0x37,
	0x6c, 0xf7, 0xc8, 0x7b, 0xdf, 0xfb, 0xbe, 0x79, 0x2f, 0xc1, 0x53, 0xae, 0x14, 0x2f, 0x01, 0xb3,
	0xc2, 0x60, 0x0b, 0x3b, 0xd4, 0xc6, 0xd8, 0x80, 0x6e, 0x45, 0x0e, 0x06, 0x97, 0x4c, 0x16, 0x42,
	0xf2, 0xac, 0x66, 0x1c, 0xb2, 0x56, 0xc0, 0x59, 0xd6, 0x53, 0xa8, 0xd6, 0xaa, 0x51, 0xe1, 0xc4,
	0x8e, 0x21, 0x56, 0x18, 0x34, 0x38, 0xa0, 0x36, 0x46, 0xce, 0x21, 0x7a, 0x3c, 0xb6, 0x43, 0x83,
	0x51, 0x2b, 0xbd, 0x75, 0x89, 0x35, 0x8f, 0xee, 0xbb, 0xd1, 0x5a, 0x60, 0x26, 0xa5, 0x6a, 0x58,
	0x23, 0x94, 0x34, 0x3d, 0x7b, 0x6f, 0x8d, 0xcd, 0x4b, 0x01, 0xb2, 0xe9, 0x89, 0x07, 0x6b, 0xc4,
	0x3b, 0x01, 0x65, 0x91, 0x9d, 0xc2, 0x7b, 0xd6, 0x0a, 0xa5, 0x7b, 0xc1, 0xfe, 0x9a, 0xc0, 0x5d,
	0x61, 0xa9, 0x43, 0x1d, 0xec, 0x2f, 0xa0, 0x79, 0x61, 0x0f, 0x5a, 0x32, 0x0e, 0x89, 0x80, 0xb3,
	0x57, 0xf0, 0x61, 0x05, 0xa6, 0x09, 0xdf, 0x04, 0x77, 0x9c, 0x3c, 0x93, 0xac, 0x82, 0x3d, 0x6f,
	0xe2, 0x1d, 0xdf, 0x9a, 0x3f, 0xfc, 0x45, 0xfd, 0xbf, 0x74, 0x1a, 0x1c, 0x5f, 0x05, 0xd0, 0xa3,
	0x5a, 0x18, 0x94, 0xab, 0x0a, 0x6f, 0xfa, 0xdd, 0x76, 0x36, 0x2f, 0x59, 0x05, 0xb3, 0xcf, 0x7e,
	0x70, 0x77, 0x43, 0xf1, 0xda, 0xa6, 0x17, 0x7e, 0xf7, 0x82, 0xf0, 0xff, 0x7b, 0xc2, 0x13, 0xb4,
	0x2b, 0x76, 0x34, 0xfa, 0x8a, 0x68, 0x36, 0x3a, 0x3c, 0x34, 0x82, 0x36, 0x46, 0x0f, 0x9f, 0xff,
	0xa4, 0xd7, 0x9f, 0x7e, 0xfe, 0xe3, 0xf7, 0x17, 0xff, 0x51, 0x38, 0xeb, 0x8a, 0xfc, 0x78, 0x8d,
	0x79, 0x92, 0xaf, 0x4c, 0xa3, 0x2a, 0xd0, 0x06, 0x4f, 0x5d, 0xb3, 0xce, 0xc7, 0xe0, 0xe9, 0xa7,
	0xe8, 0xe0, 0x82, 0xee, 0x8d, 0x25, 0x35, 0x3f, 0xf7, 0x83, 0xa3, 0x5c, 0x55, 0x3b, 0xdf, 0x37,
	0x3f, 0xd8, 0x9e, 0xd8, 0xb2, 0x6b, 0x71, 0xe9, 0xbd, 0x7d, 0xd6, 0x1b, 0x70, 0x55, 0x32, 0xc9,
	0x91, 0xd2, 0x1c, 0x73, 0x90, 0x97, 0x1d, 0xe3, 0xab, 0x95, 0xe3, 0x3f, 0xfe, 0x89, 0x03, 0x5f,
	0xfd, 0x1b, 0x0b, 0x4a, 0xbf, 0xf9, 0x93, 0x85, 0x35, 0xa4, 0x85, 0x41, 0x16, 0x76, 0x28, 0x89,
	0x51, 0xbf, 0xd8, 0x5c, 0x38, 0x49, 0x4a, 0x0b, 0x93, 0x0e, 0x92, 0x34, 0x89, 0x53, 0x27, 0xf9,
	0xe3, 0x1f, 0xd9, 0xef, 0x84, 0xd0, 0xc2, 0x10, 0x32, 0x88, 0x08, 0x49, 0x62, 0x42, 0x9c, 0xec,
	0xf4, 0xe6, 0xe5, 0x9d, 0xf1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0xe3, 0xb7, 0x44, 0x9f,
	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

// LandingPageViewServiceClient is the client API for LandingPageViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type LandingPageViewServiceClient interface {
	// Returns the requested landing page view in full detail.
	GetLandingPageView(ctx context.Context, in *GetLandingPageViewRequest, opts ...grpc.CallOption) (*resources.LandingPageView, error)
}

type landingPageViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewLandingPageViewServiceClient(cc grpc.ClientConnInterface) LandingPageViewServiceClient {
	return &landingPageViewServiceClient{cc}
}

func (c *landingPageViewServiceClient) GetLandingPageView(ctx context.Context, in *GetLandingPageViewRequest, opts ...grpc.CallOption) (*resources.LandingPageView, error) {
	out := new(resources.LandingPageView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LandingPageViewService/GetLandingPageView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// LandingPageViewServiceServer is the server API for LandingPageViewService service.
type LandingPageViewServiceServer interface {
	// Returns the requested landing page view in full detail.
	GetLandingPageView(context.Context, *GetLandingPageViewRequest) (*resources.LandingPageView, error)
}

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

func (*UnimplementedLandingPageViewServiceServer) GetLandingPageView(ctx context.Context, req *GetLandingPageViewRequest) (*resources.LandingPageView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetLandingPageView not implemented")
}

func RegisterLandingPageViewServiceServer(s *grpc.Server, srv LandingPageViewServiceServer) {
	s.RegisterService(&_LandingPageViewService_serviceDesc, srv)
}

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

var _LandingPageViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.LandingPageViewService",
	HandlerType: (*LandingPageViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetLandingPageView",
			Handler:    _LandingPageViewService_GetLandingPageView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/landing_page_view_service.proto",
}
