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

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

var xxx_messageInfo_GetAccountBudgetRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_2e805d79057ca99f = []byte{
	// 410 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0x8a, 0xd3, 0x40,
	0x1c, 0x27, 0x29, 0x08, 0x06, 0x05, 0x09, 0x42, 0x6b, 0x14, 0x2c, 0xa5, 0x87, 0xd2, 0xc3, 0x4c,
	0x69, 0x40, 0x70, 0xa4, 0x87, 0x89, 0x87, 0xf6, 0x24, 0xa5, 0x42, 0x0f, 0x12, 0x08, 0xd3, 0x64,
	0x8c, 0x81, 0x64, 0xa6, 0x66, 0x26, 0xb9, 0x88, 0x20, 0xbe, 0x82, 0x6f, 0xe0, 0xd1, 0x37, 0xb1,
	0x57, 0x6f, 0x9e, 0x3c, 0x78, 0xda, 0x97, 0xd8, 0x25, 0x9d, 0x4c, 0xda, 0xec, 0x6e, 0xe8, 0xed,
	0xc7, 0xfc, 0x7f, 0x1f, 0xff, 0x8f, 0xb1, 0x16, 0x31, 0xe7, 0x71, 0x4a, 0x21, 0x89, 0x04, 0x54,
	0xb0, 0x42, 0xa5, 0x0b, 0x05, 0xcd, 0xcb, 0x24, 0xa4, 0x02, 0x92, 0x30, 0xe4, 0x05, 0x93, 0xc1,
	0xae, 0x88, 0x62, 0x2a, 0x83, 0xfa, 0x1d, 0xec, 0x73, 0x2e, 0xb9, 0x3d, 0x54, 0x1a, 0x40, 0x22,
	0x01, 0x1a, 0x39, 0x28, 0x5d, 0xa0, 0xe5, 0xce, 0xab, 0xae, 0x80, 0x9c, 0x0a, 0x5e, 0xe4, 0x77,
	0x13, 0x94, 0xb3, 0xf3, 0x42, 0xeb, 0xf6, 0x09, 0x24, 0x8c, 0x71, 0x49, 0x64, 0xc2, 0x99, 0xa8,
	0xab, 0xfd, 0xb3, 0x6a, 0x98, 0x26, 0x94, 0x69, 0xd9, 0xcb, 0xb3, 0xc2, 0xc7, 0x84, 0xa6, 0x51,
	0xb0, 0xa3, 0x9f, 0x48, 0x99, 0xf0, 0x5c, 0x11, 0x46, 0x6f, 0xad, 0xfe, 0x92, 0x4a, 0xac, 0x22,
	0xbd, 0x63, 0xe2, 0x86, 0x7e, 0x2e, 0xa8, 0x90, 0xf6, 0xc4, 0x7a, 0xac, 0x9b, 0x0a, 0x18, 0xc9,
	0xe8, 0xc0, 0x18, 0x1a, 0x93, 0x87, 0x5e, 0xef, 0x1f, 0x36, 0x37, 0x8f, 0x74, 0xe5, 0x1d, 0xc9,
	0xe8, 0xfc, 0xda, 0xb0, 0x9e, 0xb6, 0x2c, 0xde, 0xab, 0x71, 0xed, 0xdf, 0x86, 0xf5, 0xe4, 0xb6,
	0xbd, 0xfd, 0x1a, 0x5c, 0xda, 0x12, 0xe8, 0x68, 0xc9, 0x99, 0x75, 0x4a, 0x9b, 0xf5, 0x81, 0x96,
	0x70, 0xb4, 0xfa, 0x8b, 0xdb, 0x53, 0x7c, 0xff, 0xf3, 0xff, 0x87, 0x39, 0xb7, 0x67, 0xd5, 0xce,
	0xbf, 0xb4, 0x2a, 0x8b, 0xb0, 0x10, 0x92, 0x67, 0x34, 0x17, 0x70, 0xaa, 0x8f, 0xa0, 0x5c, 0x04,
	0x9c, 0x7e, 0x75, 0x9e, 0x1f, 0xf0, 0xe0, 0x14, 0x59, 0xa3, 0x7d, 0x22, 0x40, 0xc8, 0x33, 0xef,
	0x9b, 0x69, 0x8d, 0x43, 0x9e, 0x5d, 0x9c, 0xcc, 0x7b, 0x76, 0xdf, 0x9e, 0xd6, 0xd5, 0x29, 0xd6,
	0xc6, 0x87, 0x55, 0x2d, 0x8f, 0x79, 0x4a, 0x58, 0x0c, 0x78, 0x1e, 0xc3, 0x98, 0xb2, 0xe3, 0xa1,
	0xe0, 0x29, 0xb0, 0xfb, 0x73, 0xbe, 0xd1, 0xe0, 0xa7, 0xd9, 0x5b, 0x62, 0xfc, 0xcb, 0x1c, 0x2e,
	0x95, 0x21, 0x8e, 0x04, 0x50, 0xb0, 0x42, 0x5b, 0x17, 0xd4, 0xc1, 0xe2, 0xa0, 0x29, 0x3e, 0x8e,
	0x84, 0xdf, 0x50, 0xfc, 0xad, 0xeb, 0x6b, 0xca, 0x95, 0x39, 0x56, 0xef, 0x08, 0xe1, 0x48, 0x20,
	0xd4, 0x90, 0x10, 0xda, 0xba, 0x08, 0x69, 0xda, 0xee, 0xc1, 0xb1, 0x4f, 0xf7, 0x26, 0x00, 0x00,
	0xff, 0xff, 0x7f, 0xaf, 0x6d, 0xc8, 0x43, 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

// AccountBudgetServiceClient is the client API for AccountBudgetService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type AccountBudgetServiceClient interface {
	// Returns an account-level budget in full detail.
	GetAccountBudget(ctx context.Context, in *GetAccountBudgetRequest, opts ...grpc.CallOption) (*resources.AccountBudget, error)
}

type accountBudgetServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewAccountBudgetServiceClient(cc grpc.ClientConnInterface) AccountBudgetServiceClient {
	return &accountBudgetServiceClient{cc}
}

func (c *accountBudgetServiceClient) GetAccountBudget(ctx context.Context, in *GetAccountBudgetRequest, opts ...grpc.CallOption) (*resources.AccountBudget, error) {
	out := new(resources.AccountBudget)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AccountBudgetService/GetAccountBudget", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// AccountBudgetServiceServer is the server API for AccountBudgetService service.
type AccountBudgetServiceServer interface {
	// Returns an account-level budget in full detail.
	GetAccountBudget(context.Context, *GetAccountBudgetRequest) (*resources.AccountBudget, error)
}

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

func (*UnimplementedAccountBudgetServiceServer) GetAccountBudget(ctx context.Context, req *GetAccountBudgetRequest) (*resources.AccountBudget, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetAccountBudget not implemented")
}

func RegisterAccountBudgetServiceServer(s *grpc.Server, srv AccountBudgetServiceServer) {
	s.RegisterService(&_AccountBudgetService_serviceDesc, srv)
}

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

var _AccountBudgetService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.AccountBudgetService",
	HandlerType: (*AccountBudgetServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetAccountBudget",
			Handler:    _AccountBudgetService_GetAccountBudget_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/account_budget_service.proto",
}
