// Code generated by protoc-gen-go. DO NOT EDIT.
// source: cycler/effect.proto

package cycler

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

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

// The existing storage classes.
type ChillEffectConfiguration_EnumStorageClass int32

const (
	ChillEffectConfiguration_UNKNOWN  ChillEffectConfiguration_EnumStorageClass = 0
	ChillEffectConfiguration_STANDARD ChillEffectConfiguration_EnumStorageClass = 1
	ChillEffectConfiguration_NEARLINE ChillEffectConfiguration_EnumStorageClass = 2
	ChillEffectConfiguration_COLDLINE ChillEffectConfiguration_EnumStorageClass = 3
	ChillEffectConfiguration_ARCHIVE  ChillEffectConfiguration_EnumStorageClass = 4
)

var ChillEffectConfiguration_EnumStorageClass_name = map[int32]string{
	0: "UNKNOWN",
	1: "STANDARD",
	2: "NEARLINE",
	3: "COLDLINE",
	4: "ARCHIVE",
}

var ChillEffectConfiguration_EnumStorageClass_value = map[string]int32{
	"UNKNOWN":  0,
	"STANDARD": 1,
	"NEARLINE": 2,
	"COLDLINE": 3,
	"ARCHIVE":  4,
}

func (x ChillEffectConfiguration_EnumStorageClass) String() string {
	return proto.EnumName(ChillEffectConfiguration_EnumStorageClass_name, int32(x))
}

func (ChillEffectConfiguration_EnumStorageClass) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_77ad79a3f52eadc5, []int{3, 0}
}

// Like it says on the tin, will run stats only.
type NoopEffectConfiguration struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_NoopEffectConfiguration proto.InternalMessageInfo

// Move objects that match the configuration to another bucket + prefix.
// If the destination is within the configured bucket/prefix the behavior
// on those objects created via the move is undefined. They may or may not
// exist in whole or in part at the time the prefix is iterated.
type MoveEffectConfiguration struct {
	// The destination bucket for the moved objects (e.g. 'engeg-testing-bucket').
	DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"`
	// The destination prefix for the moved objects (e.g. 'moved-files-prefix/').
	// Note: Prefixes are literal, and no '/' will be infered/appended.
	DestinationPrefix    string   `protobuf:"bytes,2,opt,name=destination_prefix,json=destinationPrefix,proto3" json:"destination_prefix,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MoveEffectConfiguration) Reset()         { *m = MoveEffectConfiguration{} }
func (m *MoveEffectConfiguration) String() string { return proto.CompactTextString(m) }
func (*MoveEffectConfiguration) ProtoMessage()    {}
func (*MoveEffectConfiguration) Descriptor() ([]byte, []int) {
	return fileDescriptor_77ad79a3f52eadc5, []int{1}
}

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

var xxx_messageInfo_MoveEffectConfiguration proto.InternalMessageInfo

func (m *MoveEffectConfiguration) GetDestinationBucket() string {
	if m != nil {
		return m.DestinationBucket
	}
	return ""
}

func (m *MoveEffectConfiguration) GetDestinationPrefix() string {
	if m != nil {
		return m.DestinationPrefix
	}
	return ""
}

// Duplicate objects that match the configuration to another bucket + prefix.
// If the destination is within the configured bucket/prefix the behavior
// on those objects created via the duplicate is undefined. They may or may not
// exist in whole or in part at the time the prefix is iterated.
type DuplicateEffectConfiguration struct {
	// The destination bucket for the copied objects (e.g. 'engeg-testing-bucket').
	DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"`
	// The destination prefix for the copied objects (e.g. 'copied-files-prefix/').
	// Note: Prefixes are literal, and no '/' will be infered/appended.
	DestinationPrefix    string   `protobuf:"bytes,2,opt,name=destination_prefix,json=destinationPrefix,proto3" json:"destination_prefix,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DuplicateEffectConfiguration) Reset()         { *m = DuplicateEffectConfiguration{} }
func (m *DuplicateEffectConfiguration) String() string { return proto.CompactTextString(m) }
func (*DuplicateEffectConfiguration) ProtoMessage()    {}
func (*DuplicateEffectConfiguration) Descriptor() ([]byte, []int) {
	return fileDescriptor_77ad79a3f52eadc5, []int{2}
}

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

var xxx_messageInfo_DuplicateEffectConfiguration proto.InternalMessageInfo

func (m *DuplicateEffectConfiguration) GetDestinationBucket() string {
	if m != nil {
		return m.DestinationBucket
	}
	return ""
}

func (m *DuplicateEffectConfiguration) GetDestinationPrefix() string {
	if m != nil {
		return m.DestinationPrefix
	}
	return ""
}

// Change the storage class of an object in place.
type ChillEffectConfiguration struct {
	// The desired destination storage class.
	ToStorageClass       ChillEffectConfiguration_EnumStorageClass `protobuf:"varint,1,opt,name=to_storage_class,json=toStorageClass,proto3,enum=cycler.ChillEffectConfiguration_EnumStorageClass" json:"to_storage_class,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *ChillEffectConfiguration) Reset()         { *m = ChillEffectConfiguration{} }
func (m *ChillEffectConfiguration) String() string { return proto.CompactTextString(m) }
func (*ChillEffectConfiguration) ProtoMessage()    {}
func (*ChillEffectConfiguration) Descriptor() ([]byte, []int) {
	return fileDescriptor_77ad79a3f52eadc5, []int{3}
}

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

var xxx_messageInfo_ChillEffectConfiguration proto.InternalMessageInfo

func (m *ChillEffectConfiguration) GetToStorageClass() ChillEffectConfiguration_EnumStorageClass {
	if m != nil {
		return m.ToStorageClass
	}
	return ChillEffectConfiguration_UNKNOWN
}

// Delete the objects that match the configuration.
type DeleteEffectConfiguration struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteEffectConfiguration) Reset()         { *m = DeleteEffectConfiguration{} }
func (m *DeleteEffectConfiguration) String() string { return proto.CompactTextString(m) }
func (*DeleteEffectConfiguration) ProtoMessage()    {}
func (*DeleteEffectConfiguration) Descriptor() ([]byte, []int) {
	return fileDescriptor_77ad79a3f52eadc5, []int{4}
}

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

var xxx_messageInfo_DeleteEffectConfiguration proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("cycler.ChillEffectConfiguration_EnumStorageClass", ChillEffectConfiguration_EnumStorageClass_name, ChillEffectConfiguration_EnumStorageClass_value)
	proto.RegisterType((*NoopEffectConfiguration)(nil), "cycler.NoopEffectConfiguration")
	proto.RegisterType((*MoveEffectConfiguration)(nil), "cycler.MoveEffectConfiguration")
	proto.RegisterType((*DuplicateEffectConfiguration)(nil), "cycler.DuplicateEffectConfiguration")
	proto.RegisterType((*ChillEffectConfiguration)(nil), "cycler.ChillEffectConfiguration")
	proto.RegisterType((*DeleteEffectConfiguration)(nil), "cycler.DeleteEffectConfiguration")
}

func init() { proto.RegisterFile("cycler/effect.proto", fileDescriptor_77ad79a3f52eadc5) }

var fileDescriptor_77ad79a3f52eadc5 = []byte{
	// 313 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0x4f, 0x4b, 0xc3, 0x30,
	0x18, 0xc6, 0xed, 0x94, 0xa9, 0x51, 0x46, 0xad, 0x87, 0x6d, 0xe8, 0x41, 0x7a, 0xf2, 0x62, 0xa2,
	0xf3, 0x13, 0x74, 0x6d, 0xc1, 0xe1, 0xcc, 0xa4, 0xd3, 0x09, 0x7a, 0x18, 0x5d, 0x4c, 0xbb, 0x60,
	0xd6, 0xb7, 0xa4, 0xa9, 0x7f, 0xc0, 0xef, 0xe8, 0x57, 0x92, 0xa6, 0x08, 0x63, 0xce, 0xb3, 0xc7,
	0xdf, 0xfb, 0x7b, 0x1f, 0x1e, 0xf2, 0x12, 0x74, 0xc8, 0x3e, 0x98, 0xe4, 0x8a, 0xf0, 0x24, 0xe1,
	0x4c, 0xe3, 0x5c, 0x81, 0x06, 0xa7, 0x59, 0x0f, 0xdd, 0x2e, 0x6a, 0x53, 0x80, 0x3c, 0x34, 0xce,
	0x87, 0x2c, 0x11, 0x69, 0xa9, 0x62, 0x2d, 0x20, 0x73, 0xdf, 0x50, 0xfb, 0x06, 0x5e, 0xf9, 0x1a,
	0xe5, 0x9c, 0x21, 0xe7, 0x99, 0x17, 0x5a, 0x64, 0x06, 0xa7, 0xb3, 0x92, 0xbd, 0x70, 0xdd, 0xb1,
	0x4e, 0xac, 0xd3, 0xdd, 0xe8, 0x60, 0xc9, 0xf4, 0x8d, 0x58, 0x5d, 0xcf, 0x15, 0x4f, 0xc4, 0x7b,
	0xa7, 0xf1, 0x6b, 0xfd, 0xd6, 0x08, 0xf7, 0x13, 0x1d, 0x07, 0x65, 0x2e, 0x05, 0x8b, 0xf5, 0x3f,
	0xb4, 0x7f, 0x59, 0xa8, 0xe3, 0xcf, 0x85, 0x94, 0xeb, 0xaa, 0x9f, 0x90, 0xad, 0x61, 0x5a, 0x68,
	0x50, 0x71, 0xca, 0xa7, 0x4c, 0xc6, 0x45, 0x61, 0x8a, 0x5b, 0xbd, 0x0b, 0x5c, 0x5f, 0x14, 0xff,
	0x95, 0xc5, 0x61, 0x56, 0x2e, 0xc6, 0x75, 0xd2, 0xaf, 0x82, 0x51, 0x4b, 0xc3, 0x32, 0xbb, 0x13,
	0x64, 0xaf, 0xee, 0x38, 0x7b, 0x68, 0xfb, 0x9e, 0x5e, 0xd3, 0xd1, 0x03, 0xb5, 0x37, 0x9c, 0x7d,
	0xb4, 0x33, 0xbe, 0xf3, 0x68, 0xe0, 0x45, 0x81, 0x6d, 0x55, 0x44, 0x43, 0x2f, 0x1a, 0x0e, 0x68,
	0x68, 0x37, 0x2a, 0xf2, 0x47, 0xc3, 0xc0, 0xd0, 0x66, 0x15, 0xf3, 0x22, 0xff, 0x6a, 0x30, 0x09,
	0xed, 0x2d, 0xf7, 0x08, 0x75, 0x03, 0x2e, 0xf9, 0xda, 0x63, 0xf6, 0x7b, 0x8f, 0xe7, 0x29, 0x60,
	0x36, 0x57, 0xb0, 0x10, 0xe5, 0x02, 0x83, 0x4a, 0xc9, 0x0f, 0x40, 0x41, 0x44, 0x96, 0xa8, 0x98,
	0x98, 0x2f, 0x43, 0x52, 0x20, 0xf5, 0x13, 0x67, 0x4d, 0x33, 0xb8, 0xfc, 0x0e, 0x00, 0x00, 0xff,
	0xff, 0x63, 0xf8, 0x37, 0x15, 0x5a, 0x02, 0x00, 0x00,
}
