// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v1/common/feed_common.proto

package common

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// 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

// Represents a price in a particular currency.
type Money struct {
	// Three-character ISO 4217 currency code.
	CurrencyCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// Amount in micros. One million is equivalent to one unit.
	AmountMicros         *wrappers.Int64Value `protobuf:"bytes,2,opt,name=amount_micros,json=amountMicros,proto3" json:"amount_micros,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Money) Reset()         { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage()    {}
func (*Money) Descriptor() ([]byte, []int) {
	return fileDescriptor_3d17791b1b55b077, []int{0}
}

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

var xxx_messageInfo_Money proto.InternalMessageInfo

func (m *Money) GetCurrencyCode() *wrappers.StringValue {
	if m != nil {
		return m.CurrencyCode
	}
	return nil
}

func (m *Money) GetAmountMicros() *wrappers.Int64Value {
	if m != nil {
		return m.AmountMicros
	}
	return nil
}

func init() {
	proto.RegisterType((*Money)(nil), "google.ads.googleads.v1.common.Money")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v1/common/feed_common.proto", fileDescriptor_3d17791b1b55b077)
}

var fileDescriptor_3d17791b1b55b077 = []byte{
	// 328 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xeb, 0x40,
	0x14, 0x86, 0x49, 0x2e, 0xd7, 0x45, 0xb4, 0x08, 0x5d, 0x95, 0x5a, 0x8a, 0x74, 0xe5, 0x6a, 0xc6,
	0xa8, 0xb8, 0x18, 0x37, 0xa6, 0x15, 0x8b, 0x8b, 0x42, 0x51, 0xc8, 0x42, 0x02, 0x65, 0x9a, 0x39,
	0x1d, 0x02, 0xcd, 0x9c, 0x30, 0x93, 0x54, 0xfa, 0x0e, 0x3e, 0x85, 0x4b, 0x1f, 0xc5, 0x47, 0xe9,
	0x53, 0x48, 0x73, 0x92, 0x6e, 0x44, 0x57, 0xf9, 0x93, 0xfc, 0xdf, 0x77, 0x66, 0x4e, 0x70, 0xa9,
	0x11, 0xf5, 0x1a, 0xb8, 0x54, 0x8e, 0x53, 0xdc, 0xa7, 0x4d, 0xc8, 0x53, 0xcc, 0x73, 0x34, 0x7c,
	0x05, 0xa0, 0x16, 0x94, 0x59, 0x61, 0xb1, 0xc4, 0xee, 0x90, 0x6a, 0x4c, 0x2a, 0xc7, 0x0e, 0x04,
	0xdb, 0x84, 0x8c, 0x5a, 0xfd, 0x41, 0x6b, 0x2c, 0x32, 0x2e, 0x8d, 0xc1, 0x52, 0x96, 0x19, 0x1a,
	0x47, 0x74, 0xbf, 0xa1, 0x79, 0xfd, 0xb6, 0xac, 0x56, 0xfc, 0xcd, 0xca, 0xa2, 0x00, 0xdb, 0xfc,
	0x1f, 0xbd, 0x7b, 0xc1, 0xff, 0x19, 0x1a, 0xd8, 0x76, 0xa3, 0xa0, 0x93, 0x56, 0xd6, 0x82, 0x49,
	0xb7, 0x8b, 0x14, 0x15, 0xf4, 0xbc, 0x73, 0xef, 0xe2, 0xf8, 0x6a, 0xd0, 0x0c, 0x65, 0xad, 0x81,
	0xbd, 0x94, 0x36, 0x33, 0x3a, 0x96, 0xeb, 0x0a, 0x9e, 0x4f, 0x5a, 0x64, 0x82, 0x0a, 0xba, 0xf7,
	0x41, 0x47, 0xe6, 0x58, 0x99, 0x72, 0x91, 0x67, 0xa9, 0x45, 0xd7, 0xf3, 0x6b, 0xc5, 0xd9, 0x0f,
	0xc5, 0x93, 0x29, 0x6f, 0x6f, 0x1a, 0x03, 0x11, 0xb3, 0x1a, 0x18, 0xef, 0xbc, 0x60, 0x94, 0x62,
	0xce, 0xfe, 0xbe, 0xf3, 0xf8, 0xf4, 0x11, 0x40, 0x4d, 0xea, 0x3c, 0xdf, 0x3b, 0xe7, 0xde, 0xeb,
	0x43, 0x83, 0x68, 0x5c, 0x4b, 0xa3, 0x19, 0x5a, 0xcd, 0x35, 0x98, 0x7a, 0x62, 0xbb, 0xe8, 0x22,
	0x73, 0xbf, 0xed, 0xfd, 0x8e, 0x1e, 0x1f, 0xfe, 0xbf, 0x69, 0x14, 0x7d, 0xfa, 0xc3, 0x29, 0xc9,
	0x22, 0xe5, 0x18, 0xc5, 0x7d, 0x8a, 0x43, 0x46, 0x33, 0xbf, 0xda, 0x42, 0x12, 0x29, 0x97, 0x1c,
	0x0a, 0x49, 0x1c, 0x26, 0x54, 0xd8, 0xf9, 0x23, 0xfa, 0x2a, 0x44, 0xa4, 0x9c, 0x10, 0x87, 0x8a,
	0x10, 0x71, 0x28, 0x04, 0x95, 0x96, 0x47, 0xf5, 0xe9, 0xae, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff,
	0xbc, 0x66, 0x16, 0x39, 0x14, 0x02, 0x00, 0x00,
}
