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

// 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 {
	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 init() {
	proto.RegisterType((*NoopEffectConfiguration)(nil), "cycler.NoopEffectConfiguration")
	proto.RegisterType((*MoveEffectConfiguration)(nil), "cycler.MoveEffectConfiguration")
	proto.RegisterType((*DuplicateEffectConfiguration)(nil), "cycler.DuplicateEffectConfiguration")
	proto.RegisterType((*ChillEffectConfiguration)(nil), "cycler.ChillEffectConfiguration")
}

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

var fileDescriptor_77ad79a3f52eadc5 = []byte{
	// 199 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4e, 0xae, 0x4c, 0xce,
	0x49, 0x2d, 0xd2, 0x4f, 0x4d, 0x4b, 0x4b, 0x4d, 0x2e, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17,
	0x62, 0x83, 0x08, 0x2a, 0x49, 0x72, 0x89, 0xfb, 0xe5, 0xe7, 0x17, 0xb8, 0x82, 0xe5, 0x9c, 0xf3,
	0xf3, 0xd2, 0x32, 0xd3, 0x4b, 0x8b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x94, 0xca, 0xb9, 0xc4, 0x7d,
	0xf3, 0xcb, 0x52, 0xb1, 0x48, 0x09, 0xe9, 0x72, 0x09, 0xa5, 0xa4, 0x16, 0x97, 0x64, 0xe6, 0x81,
	0xb9, 0xf1, 0x49, 0xa5, 0xc9, 0xd9, 0xa9, 0x25, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x82,
	0x48, 0x32, 0x4e, 0x60, 0x09, 0x74, 0xe5, 0x05, 0x45, 0xa9, 0x69, 0x99, 0x15, 0x12, 0x4c, 0x18,
	0xca, 0x03, 0xc0, 0x12, 0x4a, 0x35, 0x5c, 0x32, 0x2e, 0xa5, 0x05, 0x39, 0x99, 0xc9, 0x89, 0x25,
	0x03, 0x60, 0xbb, 0x14, 0x97, 0x84, 0x73, 0x46, 0x66, 0x4e, 0x0e, 0x16, 0x9b, 0x9d, 0x8c, 0xa2,
	0x0c, 0xd2, 0xf3, 0xf5, 0x92, 0x33, 0x8a, 0xf2, 0x73, 0x33, 0x4b, 0x73, 0xf5, 0xf2, 0x8b, 0xd2,
	0xf5, 0x61, 0x9c, 0xfc, 0x62, 0xfd, 0xcc, 0xbc, 0xb4, 0xa2, 0x44, 0x7d, 0x70, 0xf8, 0xea, 0xa7,
	0xe7, 0xeb, 0x43, 0x42, 0x38, 0x89, 0x0d, 0x2c, 0x60, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x29,
	0x5c, 0x7c, 0x3d, 0x87, 0x01, 0x00, 0x00,
}
