// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/feed_origin.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "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

// Possible values for a feed origin.
type FeedOriginEnum_FeedOrigin int32

const (
	// Not specified.
	FeedOriginEnum_UNSPECIFIED FeedOriginEnum_FeedOrigin = 0
	// Used for return value only. Represents value unknown in this version.
	FeedOriginEnum_UNKNOWN FeedOriginEnum_FeedOrigin = 1
	// The FeedAttributes for this Feed are managed by the
	// user. Users can add FeedAttributes to this Feed.
	FeedOriginEnum_USER FeedOriginEnum_FeedOrigin = 2
	// The FeedAttributes for an GOOGLE Feed are created by Google. A feed of
	// this type is maintained by Google and will have the correct attributes
	// for the placeholder type of the feed.
	FeedOriginEnum_GOOGLE FeedOriginEnum_FeedOrigin = 3
)

var FeedOriginEnum_FeedOrigin_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "USER",
	3: "GOOGLE",
}

var FeedOriginEnum_FeedOrigin_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"USER":        2,
	"GOOGLE":      3,
}

func (x FeedOriginEnum_FeedOrigin) String() string {
	return proto.EnumName(FeedOriginEnum_FeedOrigin_name, int32(x))
}

func (FeedOriginEnum_FeedOrigin) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6bf0e294be3d78df, []int{0, 0}
}

// Container for enum describing possible values for a feed origin.
type FeedOriginEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FeedOriginEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedOriginEnum_FeedOrigin", FeedOriginEnum_FeedOrigin_name, FeedOriginEnum_FeedOrigin_value)
	proto.RegisterType((*FeedOriginEnum)(nil), "google.ads.googleads.v3.enums.FeedOriginEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/feed_origin.proto", fileDescriptor_6bf0e294be3d78df)
}

var fileDescriptor_6bf0e294be3d78df = []byte{
	// 293 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x18, 0xb7, 0x9d, 0x4c, 0xc9, 0xc0, 0x95, 0x1e, 0xc5, 0x1d, 0xb6, 0x07, 0x48, 0x0e, 0xb9, 0xc5,
	0x8b, 0xad, 0x76, 0x65, 0x28, 0x6d, 0xd9, 0x68, 0x05, 0x29, 0x48, 0x35, 0x31, 0x14, 0xd6, 0xa4,
	0x34, 0xdd, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0x73, 0x78, 0xf2, 0x29, 0xa4, 0xc9, 0xda, 0x9d, 0xdc,
	0x25, 0xfc, 0xf8, 0x7e, 0x7f, 0xf2, 0xfb, 0x3e, 0x80, 0xb8, 0x94, 0x7c, 0xcb, 0x50, 0x41, 0xd5,
	0x01, 0x76, 0x68, 0x8f, 0x11, 0x13, 0xbb, 0x4a, 0xa1, 0x0f, 0xc6, 0xe8, 0xab, 0x6c, 0x4a, 0x5e,
	0x0a, 0x58, 0x37, 0xb2, 0x95, 0xee, 0xcc, 0xa8, 0x60, 0x41, 0x15, 0x1c, 0x0c, 0x70, 0x8f, 0xa1,
	0x36, 0x5c, 0xdf, 0xf4, 0x79, 0x75, 0x89, 0x0a, 0x21, 0x64, 0x5b, 0xb4, 0xa5, 0x14, 0xca, 0x98,
	0x17, 0x6b, 0x70, 0xb5, 0x64, 0x8c, 0xc6, 0x3a, 0x30, 0x10, 0xbb, 0x6a, 0x71, 0x07, 0xc0, 0x71,
	0xe2, 0x4e, 0xc1, 0x24, 0x8d, 0x36, 0x49, 0x70, 0xbf, 0x5a, 0xae, 0x82, 0x07, 0xe7, 0xcc, 0x9d,
	0x80, 0x8b, 0x34, 0x7a, 0x8c, 0xe2, 0xe7, 0xc8, 0xb1, 0xdc, 0x4b, 0x70, 0x9e, 0x6e, 0x82, 0xb5,
	0x63, 0xbb, 0x00, 0x8c, 0xc3, 0x38, 0x0e, 0x9f, 0x02, 0x67, 0xe4, 0xff, 0x58, 0x60, 0xfe, 0x2e,
	0x2b, 0x78, 0xb2, 0x97, 0x3f, 0x3d, 0xfe, 0x92, 0x74, 0x55, 0x12, 0xeb, 0xc5, 0x3f, 0x38, 0xb8,
	0xdc, 0x16, 0x82, 0x43, 0xd9, 0x70, 0xc4, 0x99, 0xd0, 0x45, 0xfb, 0x53, 0xd4, 0xa5, 0xfa, 0xe7,
	0x32, 0xb7, 0xfa, 0xfd, 0xb4, 0x47, 0xa1, 0xe7, 0x7d, 0xd9, 0xb3, 0xd0, 0x44, 0x79, 0x54, 0x41,
	0x03, 0x3b, 0x94, 0x61, 0xd8, 0xed, 0xa8, 0xbe, 0x7b, 0x3e, 0xf7, 0xa8, 0xca, 0x07, 0x3e, 0xcf,
	0x70, 0xae, 0xf9, 0x5f, 0x7b, 0x6e, 0x86, 0x84, 0x78, 0x54, 0x11, 0x32, 0x28, 0x08, 0xc9, 0x30,
	0x21, 0x5a, 0xf3, 0x36, 0xd6, 0xc5, 0xf0, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0xff, 0x11,
	0xd4, 0xb1, 0x01, 0x00, 0x00,
}
