// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/language_constant_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 [LanguageConstantService.GetLanguageConstant][google.ads.googleads.v3.services.LanguageConstantService.GetLanguageConstant].
type GetLanguageConstantRequest struct {
	// Required. Resource name of the language constant 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 *GetLanguageConstantRequest) Reset()         { *m = GetLanguageConstantRequest{} }
func (m *GetLanguageConstantRequest) String() string { return proto.CompactTextString(m) }
func (*GetLanguageConstantRequest) ProtoMessage()    {}
func (*GetLanguageConstantRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_450309200542a061, []int{0}
}

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

var xxx_messageInfo_GetLanguageConstantRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_450309200542a061 = []byte{
	// 403 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcf, 0x4a, 0xe3, 0x40,
	0x18, 0x27, 0x29, 0x2c, 0x6c, 0xd8, 0xbd, 0x64, 0x0f, 0x2d, 0xd9, 0xc2, 0x96, 0x52, 0xd8, 0xee,
	0x1e, 0x66, 0x60, 0x73, 0xda, 0x51, 0xd1, 0xa9, 0x60, 0x3d, 0x88, 0x94, 0x0a, 0x3d, 0x48, 0x20,
	0x4c, 0x93, 0x31, 0x06, 0x92, 0x99, 0x9a, 0x49, 0x73, 0x11, 0x2f, 0xf5, 0x11, 0x7c, 0x03, 0x8f,
	0xbe, 0x89, 0xbd, 0x7a, 0xf3, 0xe4, 0xc1, 0x93, 0x4f, 0x21, 0xe9, 0x64, 0xd2, 0x3f, 0x34, 0xf4,
	0xf6, 0x23, 0xbf, 0x7f, 0xdf, 0x7c, 0x5f, 0x8c, 0xa3, 0x80, 0xf3, 0x20, 0xa2, 0x90, 0xf8, 0x02,
	0x4a, 0x98, 0xa3, 0xcc, 0x86, 0x82, 0x26, 0x59, 0xe8, 0x51, 0x01, 0x23, 0xc2, 0x82, 0x29, 0x09,
	0xa8, 0xeb, 0x71, 0x26, 0x52, 0xc2, 0x52, 0xb7, 0xa0, 0xc0, 0x24, 0xe1, 0x29, 0x37, 0x5b, 0xd2,
	0x06, 0x88, 0x2f, 0x40, 0x99, 0x00, 0x32, 0x1b, 0xa8, 0x04, 0xeb, 0x7f, 0x55, 0x47, 0x42, 0x05,
	0x9f, 0x26, 0x5b, 0x4b, 0x64, 0xb8, 0xd5, 0x54, 0xd6, 0x49, 0x08, 0x09, 0x63, 0x3c, 0x25, 0x69,
	0xc8, 0x99, 0x28, 0xd8, 0xfa, 0x0a, 0xeb, 0x45, 0x21, 0x2d, 0x6d, 0xbf, 0x56, 0x88, 0xab, 0x90,
	0x46, 0xbe, 0x3b, 0xa6, 0xd7, 0x24, 0x0b, 0x79, 0x22, 0x05, 0xed, 0x13, 0xc3, 0xea, 0xd3, 0xf4,
	0xac, 0x68, 0x3d, 0x2e, 0x4a, 0x87, 0xf4, 0x66, 0x4a, 0x45, 0x6a, 0x76, 0x8d, 0xef, 0x6a, 0x34,
	0x97, 0x91, 0x98, 0x36, 0xb4, 0x96, 0xd6, 0xfd, 0xda, 0xab, 0xbd, 0x61, 0x7d, 0xf8, 0x4d, 0x31,
	0xe7, 0x24, 0xa6, 0xff, 0x66, 0xba, 0x51, 0xdf, 0x4c, 0xb9, 0x90, 0xef, 0x36, 0x9f, 0x35, 0xe3,
	0xc7, 0x96, 0x12, 0x73, 0x1f, 0xec, 0xda, 0x18, 0xa8, 0x9e, 0xcd, 0xb2, 0x2b, 0xdd, 0xe5, 0x36,
	0xc1, 0xa6, 0xb7, 0x7d, 0xf8, 0x8a, 0xd7, 0x5f, 0x34, 0x7b, 0x79, 0x7f, 0xd0, 0xff, 0x98, 0xbf,
	0xf3, 0x2b, 0xdc, 0xae, 0x31, 0x07, 0xd1, 0x86, 0x59, 0xc0, 0xbf, 0x77, 0xd6, 0xcf, 0x39, 0x6e,
	0x2c, 0xcb, 0x0a, 0x34, 0x09, 0x05, 0xf0, 0x78, 0xdc, 0xbb, 0xd7, 0x8d, 0x8e, 0xc7, 0xe3, 0x9d,
	0xcf, 0xea, 0x35, 0x2b, 0x56, 0x35, 0xc8, 0x6f, 0x32, 0xd0, 0x2e, 0x4f, 0x8b, 0x84, 0x80, 0xe7,
	0x43, 0x00, 0x9e, 0x04, 0x30, 0xa0, 0x6c, 0x71, 0x31, 0xb8, 0xec, 0xac, 0xfe, 0x57, 0xf7, 0x14,
	0x78, 0xd4, 0x6b, 0x7d, 0x8c, 0x9f, 0xf4, 0x56, 0x5f, 0x06, 0x62, 0x5f, 0x00, 0x09, 0x73, 0x34,
	0xb2, 0x41, 0x51, 0x2c, 0xe6, 0x4a, 0xe2, 0x60, 0x5f, 0x38, 0xa5, 0xc4, 0x19, 0xd9, 0x8e, 0x92,
	0x7c, 0xe8, 0x1d, 0xf9, 0x1d, 0x21, 0xec, 0x0b, 0x84, 0x4a, 0x11, 0x42, 0x23, 0x1b, 0x21, 0x25,
	0x1b, 0x7f, 0x59, 0xcc, 0x69, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x71, 0x1d, 0x0c, 0x73, 0x52,
	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

// LanguageConstantServiceClient is the client API for LanguageConstantService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type LanguageConstantServiceClient interface {
	// Returns the requested language constant.
	GetLanguageConstant(ctx context.Context, in *GetLanguageConstantRequest, opts ...grpc.CallOption) (*resources.LanguageConstant, error)
}

type languageConstantServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewLanguageConstantServiceClient(cc grpc.ClientConnInterface) LanguageConstantServiceClient {
	return &languageConstantServiceClient{cc}
}

func (c *languageConstantServiceClient) GetLanguageConstant(ctx context.Context, in *GetLanguageConstantRequest, opts ...grpc.CallOption) (*resources.LanguageConstant, error) {
	out := new(resources.LanguageConstant)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.LanguageConstantService/GetLanguageConstant", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// LanguageConstantServiceServer is the server API for LanguageConstantService service.
type LanguageConstantServiceServer interface {
	// Returns the requested language constant.
	GetLanguageConstant(context.Context, *GetLanguageConstantRequest) (*resources.LanguageConstant, error)
}

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

func (*UnimplementedLanguageConstantServiceServer) GetLanguageConstant(ctx context.Context, req *GetLanguageConstantRequest) (*resources.LanguageConstant, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetLanguageConstant not implemented")
}

func RegisterLanguageConstantServiceServer(s *grpc.Server, srv LanguageConstantServiceServer) {
	s.RegisterService(&_LanguageConstantService_serviceDesc, srv)
}

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

var _LanguageConstantService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.LanguageConstantService",
	HandlerType: (*LanguageConstantServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetLanguageConstant",
			Handler:    _LanguageConstantService_GetLanguageConstant_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/language_constant_service.proto",
}
