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

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

var xxx_messageInfo_GetExpandedLandingPageViewRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_50015c0516433256 = []byte{
	// 429 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xb1, 0x8b, 0xd4, 0x40,
	0x14, 0xc6, 0x49, 0x0e, 0x04, 0x83, 0x36, 0x69, 0x3c, 0xa2, 0xe8, 0x7a, 0x5e, 0x71, 0x5c, 0x31,
	0x03, 0xa6, 0x1b, 0xb5, 0x98, 0x88, 0xac, 0x82, 0xca, 0xb2, 0x42, 0x0a, 0x09, 0x84, 0xb9, 0xcc,
	0x73, 0x1c, 0x48, 0x66, 0x62, 0x26, 0x9b, 0x13, 0xc4, 0xc6, 0xd2, 0xd6, 0xff, 0xc0, 0xd2, 0xce,
	0x7f, 0xe3, 0x5a, 0x3b, 0x2b, 0x0b, 0x2b, 0x3b, 0xff, 0x03, 0xc9, 0x4d, 0x26, 0xbb, 0x2b, 0x64,
	0xb7, 0xfb, 0xd8, 0xef, 0xdb, 0xdf, 0xf7, 0xe6, 0xbd, 0x04, 0xcf, 0x84, 0xd6, 0xa2, 0x04, 0xcc,
	0xb8, 0xc1, 0x56, 0xf6, 0xaa, 0x8b, 0xb1, 0x81, 0xa6, 0x93, 0x05, 0x18, 0x0c, 0xef, 0x6b, 0xa6,
	0x38, 0xf0, 0xbc, 0x64, 0x8a, 0x4b, 0x25, 0xf2, 0x9a, 0x09, 0xc8, 0x3b, 0x09, 0xe7, 0xf9, 0x90,
	0x41, 0x75, 0xa3, 0x5b, 0x1d, 0xce, 0xec, 0xff, 0x11, 0xe3, 0x06, 0x8d, 0x28, 0xd4, 0xc5, 0xc8,
	0xa1, 0xa2, 0x64, 0xaa, 0xac, 0x01, 0xa3, 0x57, 0xcd, 0xee, 0x36, 0xdb, 0x12, 0xdd, 0x72, 0x8c,
	0x5a, 0x62, 0xa6, 0x94, 0x6e, 0x59, 0x2b, 0xb5, 0x32, 0x83, 0x7b, 0x63, 0xc3, 0x2d, 0x4a, 0x09,
	0xaa, 0x1d, 0x8c, 0x3b, 0x1b, 0xc6, 0x1b, 0x09, 0x25, 0xcf, 0xcf, 0xe0, 0x2d, 0xeb, 0xa4, 0x6e,
	0x6c, 0xe0, 0xe8, 0x45, 0x70, 0x77, 0x0e, 0xed, 0x93, 0xa1, 0xfe, 0xb9, 0x6d, 0x5f, 0x30, 0x01,
	0xa9, 0x84, 0xf3, 0x25, 0xbc, 0x5b, 0x81, 0x69, 0xc3, 0x93, 0xe0, 0xba, 0x1b, 0x35, 0x57, 0xac,
	0x82, 0x43, 0x6f, 0xe6, 0x9d, 0x5c, 0x4d, 0x0e, 0x7e, 0x51, 0x7f, 0x79, 0xcd, 0x39, 0x2f, 0x59,
	0x05, 0xf7, 0xbf, 0xfb, 0xc1, 0xed, 0x09, 0xd8, 0x2b, 0xbb, 0x8e, 0xf0, 0xaf, 0x17, 0x44, 0xd3,
	0x95, 0xe1, 0x63, 0xb4, 0x6f, 0x9f, 0x68, 0xef, 0xc0, 0x11, 0x99, 0x84, 0x8c, 0x2b, 0x47, 0x13,
	0x88, 0xa3, 0xe5, 0x4f, 0xba, 0xfd, 0xda, 0x4f, 0x3f, 0x7e, 0x7f, 0xf1, 0x1f, 0x86, 0xa4, 0xbf,
	0xd8, 0x87, 0x2d, 0xe7, 0x51, 0xb1, 0x32, 0xad, 0xae, 0xa0, 0x31, 0xf8, 0x74, 0x3c, 0xe1, 0x7f,
	0x3c, 0x83, 0x4f, 0x3f, 0x46, 0x37, 0x2f, 0xe8, 0xe1, 0x7a, 0x8c, 0x41, 0xd5, 0xd2, 0xa0, 0x42,
	0x57, 0xc9, 0x67, 0x3f, 0x38, 0x2e, 0x74, 0xb5, 0xf7, 0xdd, 0xc9, 0xbd, 0xdd, 0x9b, 0x5d, 0xf4,
	0x07, 0x5d, 0x78, 0xaf, 0x9f, 0x0e, 0x20, 0xa1, 0x4b, 0xa6, 0x04, 0xd2, 0x8d, 0xc0, 0x02, 0xd4,
	0xe5, 0xb9, 0xf1, 0xba, 0x7a, 0xfa, 0xd3, 0x7f, 0xe0, 0xc4, 0x57, 0xff, 0x60, 0x4e, 0xe9, 0x37,
	0x7f, 0x36, 0xb7, 0x40, 0xca, 0x0d, 0xb2, 0xb2, 0x57, 0x69, 0x8c, 0x86, 0x62, 0x73, 0xe1, 0x22,
	0x19, 0xe5, 0x26, 0x1b, 0x23, 0x59, 0x1a, 0x67, 0x2e, 0xf2, 0xc7, 0x3f, 0xb6, 0xbf, 0x13, 0x42,
	0xb9, 0x21, 0x64, 0x0c, 0x11, 0x92, 0xc6, 0x84, 0xb8, 0xd8, 0xd9, 0x95, 0xcb, 0x39, 0xe3, 0x7f,
	0x01, 0x00, 0x00, 0xff, 0xff, 0x85, 0x54, 0xcc, 0x3d, 0xa1, 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

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

type expandedLandingPageViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewExpandedLandingPageViewServiceClient(cc grpc.ClientConnInterface) ExpandedLandingPageViewServiceClient {
	return &expandedLandingPageViewServiceClient{cc}
}

func (c *expandedLandingPageViewServiceClient) GetExpandedLandingPageView(ctx context.Context, in *GetExpandedLandingPageViewRequest, opts ...grpc.CallOption) (*resources.ExpandedLandingPageView, error) {
	out := new(resources.ExpandedLandingPageView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ExpandedLandingPageViewService/GetExpandedLandingPageView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ExpandedLandingPageViewServiceServer is the server API for ExpandedLandingPageViewService service.
type ExpandedLandingPageViewServiceServer interface {
	// Returns the requested expanded landing page view in full detail.
	GetExpandedLandingPageView(context.Context, *GetExpandedLandingPageViewRequest) (*resources.ExpandedLandingPageView, error)
}

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

func (*UnimplementedExpandedLandingPageViewServiceServer) GetExpandedLandingPageView(ctx context.Context, req *GetExpandedLandingPageViewRequest) (*resources.ExpandedLandingPageView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetExpandedLandingPageView not implemented")
}

func RegisterExpandedLandingPageViewServiceServer(s *grpc.Server, srv ExpandedLandingPageViewServiceServer) {
	s.RegisterService(&_ExpandedLandingPageViewService_serviceDesc, srv)
}

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

var _ExpandedLandingPageViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.ExpandedLandingPageViewService",
	HandlerType: (*ExpandedLandingPageViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetExpandedLandingPageView",
			Handler:    _ExpandedLandingPageViewService_GetExpandedLandingPageView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/expanded_landing_page_view_service.proto",
}
