// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: config/replication_config.proto

package config

import (
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Describes different file types that can be replicated.
type FileType int32

const (
	FileType_FILE_TYPE_UNSPECIFIED FileType = 0
	// A JSON file. For protos encoded as JSON, FILE_TYPE_JSONPB should be used.
	FileType_FILE_TYPE_JSON FileType = 1
	// A proto encoded as a JSON file.
	FileType_FILE_TYPE_JSONPB FileType = 2
	// A file not described by the other types.
	FileType_FILE_TYPE_OTHER FileType = 3
)

// Enum value maps for FileType.
var (
	FileType_name = map[int32]string{
		0: "FILE_TYPE_UNSPECIFIED",
		1: "FILE_TYPE_JSON",
		2: "FILE_TYPE_JSONPB",
		3: "FILE_TYPE_OTHER",
	}
	FileType_value = map[string]int32{
		"FILE_TYPE_UNSPECIFIED": 0,
		"FILE_TYPE_JSON":        1,
		"FILE_TYPE_JSONPB":      2,
		"FILE_TYPE_OTHER":       3,
	}
)

func (x FileType) Enum() *FileType {
	p := new(FileType)
	*p = x
	return p
}

func (x FileType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FileType) Descriptor() protoreflect.EnumDescriptor {
	return file_config_replication_config_proto_enumTypes[0].Descriptor()
}

func (FileType) Type() protoreflect.EnumType {
	return &file_config_replication_config_proto_enumTypes[0]
}

func (x FileType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FileType.Descriptor instead.
func (FileType) EnumDescriptor() ([]byte, []int) {
	return file_config_replication_config_proto_rawDescGZIP(), []int{0}
}

type ReplicationType int32

const (
	ReplicationType_REPLICATION_TYPE_UNSPECIFIED ReplicationType = 0
	// Copy the entire file.
	ReplicationType_REPLICATION_TYPE_COPY ReplicationType = 1
	// Copy part of the file. When this type is used, a filtering mechanism must
	// be specified, e.g. a FieldMask. Not valid for some FileTypes, e.g.
	// FILE_TYPE_OTHER.
	ReplicationType_REPLICATION_TYPE_FILTER ReplicationType = 2
)

// Enum value maps for ReplicationType.
var (
	ReplicationType_name = map[int32]string{
		0: "REPLICATION_TYPE_UNSPECIFIED",
		1: "REPLICATION_TYPE_COPY",
		2: "REPLICATION_TYPE_FILTER",
	}
	ReplicationType_value = map[string]int32{
		"REPLICATION_TYPE_UNSPECIFIED": 0,
		"REPLICATION_TYPE_COPY":        1,
		"REPLICATION_TYPE_FILTER":      2,
	}
)

func (x ReplicationType) Enum() *ReplicationType {
	p := new(ReplicationType)
	*p = x
	return p
}

func (x ReplicationType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ReplicationType) Descriptor() protoreflect.EnumDescriptor {
	return file_config_replication_config_proto_enumTypes[1].Descriptor()
}

func (ReplicationType) Type() protoreflect.EnumType {
	return &file_config_replication_config_proto_enumTypes[1]
}

func (x ReplicationType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ReplicationType.Descriptor instead.
func (ReplicationType) EnumDescriptor() ([]byte, []int) {
	return file_config_replication_config_proto_rawDescGZIP(), []int{1}
}

// Describes how to replace a text with another text.
type StringReplacementRule struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The text before the transformation.
	Before string `protobuf:"bytes,1,opt,name=before,proto3" json:"before,omitempty"`
	// The text after the transformation.
	After string `protobuf:"bytes,2,opt,name=after,proto3" json:"after,omitempty"`
}

func (x *StringReplacementRule) Reset() {
	*x = StringReplacementRule{}
	if protoimpl.UnsafeEnabled {
		mi := &file_config_replication_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StringReplacementRule) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StringReplacementRule) ProtoMessage() {}

func (x *StringReplacementRule) ProtoReflect() protoreflect.Message {
	mi := &file_config_replication_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use StringReplacementRule.ProtoReflect.Descriptor instead.
func (*StringReplacementRule) Descriptor() ([]byte, []int) {
	return file_config_replication_config_proto_rawDescGZIP(), []int{0}
}

func (x *StringReplacementRule) GetBefore() string {
	if x != nil {
		return x.Before
	}
	return ""
}

func (x *StringReplacementRule) GetAfter() string {
	if x != nil {
		return x.After
	}
	return ""
}

// Describes how a single file should be replicated.
type FileReplicationRule struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Path to the original file. Should be relative to the source root,
	// e.g. "src/private-overlays/overlay-coral-private/chromeos-base/chromeos-config-bsp-coral-private/files/build_config.json"
	SourcePath string `protobuf:"bytes,1,opt,name=source_path,json=sourcePath,proto3" json:"source_path,omitempty"`
	// Path to output the file. Should be relative to the source root,
	// e.g. "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp-coral/files/build_config.json"
	DestinationPath string `protobuf:"bytes,2,opt,name=destination_path,json=destinationPath,proto3" json:"destination_path,omitempty"`
	// The type of file being replicated.
	FileType FileType `protobuf:"varint,3,opt,name=file_type,json=fileType,proto3,enum=config.FileType" json:"file_type,omitempty"`
	// The type of replication being done.
	ReplicationType ReplicationType `protobuf:"varint,4,opt,name=replication_type,json=replicationType,proto3,enum=config.ReplicationType" json:"replication_type,omitempty"`
	// Fields to replicate to destination config payloads. Only relevant for
	// REPLICATION_TYPE_FILTER. If set on other replication types a
	// reader of this rule may choose to ignore this field or throw an error.
	//
	// # Behavior Specific to ChromeOS Config Payloads
	//
	// The mask applies to each device config in the config payload, NOT to the
	// top-level payload; i.e. to copy the "audio" field to the destination,
	// the mask should be "audio", not "chromeos.configs.audio". This is
	// analogous to standard FieldMask behavior on a REST list operation, where
	// the mask applies to each individual message. Sub-fields are still
	// fully-qualified, as per standard FieldMasks, e.g.
	// "bluetooth.config.build-path"
	DestinationFields *field_mask.FieldMask `protobuf:"bytes,5,opt,name=destination_fields,json=destinationFields,proto3" json:"destination_fields,omitempty"`
	// String replacements to be done on the destination file. Replacements are
	// done in the order they appear in this list.
	//
	// Note that replacements are done after filtering. For example, say a
	// replacement rule changes the name of a field, "field1" -> "field2"; if
	// destination_fields specifies "field2", the renamed fields will not be
	// copied.
	StringReplacementRules []*StringReplacementRule `protobuf:"bytes,6,rep,name=string_replacement_rules,json=stringReplacementRules,proto3" json:"string_replacement_rules,omitempty"`
}

func (x *FileReplicationRule) Reset() {
	*x = FileReplicationRule{}
	if protoimpl.UnsafeEnabled {
		mi := &file_config_replication_config_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FileReplicationRule) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FileReplicationRule) ProtoMessage() {}

func (x *FileReplicationRule) ProtoReflect() protoreflect.Message {
	mi := &file_config_replication_config_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FileReplicationRule.ProtoReflect.Descriptor instead.
func (*FileReplicationRule) Descriptor() ([]byte, []int) {
	return file_config_replication_config_proto_rawDescGZIP(), []int{1}
}

func (x *FileReplicationRule) GetSourcePath() string {
	if x != nil {
		return x.SourcePath
	}
	return ""
}

func (x *FileReplicationRule) GetDestinationPath() string {
	if x != nil {
		return x.DestinationPath
	}
	return ""
}

func (x *FileReplicationRule) GetFileType() FileType {
	if x != nil {
		return x.FileType
	}
	return FileType_FILE_TYPE_UNSPECIFIED
}

func (x *FileReplicationRule) GetReplicationType() ReplicationType {
	if x != nil {
		return x.ReplicationType
	}
	return ReplicationType_REPLICATION_TYPE_UNSPECIFIED
}

func (x *FileReplicationRule) GetDestinationFields() *field_mask.FieldMask {
	if x != nil {
		return x.DestinationFields
	}
	return nil
}

func (x *FileReplicationRule) GetStringReplacementRules() []*StringReplacementRule {
	if x != nil {
		return x.StringReplacementRules
	}
	return nil
}

// Describes how files should be replicated, e.g. from private to public.
type ReplicationConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Files to be replicated.
	FileReplicationRules []*FileReplicationRule `protobuf:"bytes,1,rep,name=file_replication_rules,json=fileReplicationRules,proto3" json:"file_replication_rules,omitempty"`
}

func (x *ReplicationConfig) Reset() {
	*x = ReplicationConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_config_replication_config_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ReplicationConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReplicationConfig) ProtoMessage() {}

func (x *ReplicationConfig) ProtoReflect() protoreflect.Message {
	mi := &file_config_replication_config_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ReplicationConfig.ProtoReflect.Descriptor instead.
func (*ReplicationConfig) Descriptor() ([]byte, []int) {
	return file_config_replication_config_proto_rawDescGZIP(), []int{2}
}

func (x *ReplicationConfig) GetFileReplicationRules() []*FileReplicationRule {
	if x != nil {
		return x.FileReplicationRules
	}
	return nil
}

var File_config_replication_config_proto protoreflect.FileDescriptor

var file_config_replication_config_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x45, 0x0a, 0x15, 0x53,
	0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
	0x52, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05,
	0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x66, 0x74,
	0x65, 0x72, 0x22, 0xf8, 0x02, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f,
	0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x64,
	0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x66, 0x69, 0x6c,
	0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x65, 0x73,
	0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,
	0x6b, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69,
	0x65, 0x6c, 0x64, 0x73, 0x12, 0x57, 0x0a, 0x18, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72,
	0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73,
	0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
	0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x16, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70,
	0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x66, 0x0a,
	0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x12, 0x51, 0x0a, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69, 0x6c, 0x65,
	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x52,
	0x14, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x52, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x64, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70,
	0x65, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e,
	0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01,
	0x12, 0x14, 0x0a, 0x10, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53,
	0x4f, 0x4e, 0x50, 0x42, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x54,
	0x59, 0x50, 0x45, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x03, 0x2a, 0x6b, 0x0a, 0x0f, 0x52,
	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20,
	0x0a, 0x1c, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59,
	0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,
	0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x52,
	0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
	0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x10, 0x02, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_config_replication_config_proto_rawDescOnce sync.Once
	file_config_replication_config_proto_rawDescData = file_config_replication_config_proto_rawDesc
)

func file_config_replication_config_proto_rawDescGZIP() []byte {
	file_config_replication_config_proto_rawDescOnce.Do(func() {
		file_config_replication_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_config_replication_config_proto_rawDescData)
	})
	return file_config_replication_config_proto_rawDescData
}

var file_config_replication_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_config_replication_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_config_replication_config_proto_goTypes = []interface{}{
	(FileType)(0),                 // 0: config.FileType
	(ReplicationType)(0),          // 1: config.ReplicationType
	(*StringReplacementRule)(nil), // 2: config.StringReplacementRule
	(*FileReplicationRule)(nil),   // 3: config.FileReplicationRule
	(*ReplicationConfig)(nil),     // 4: config.ReplicationConfig
	(*field_mask.FieldMask)(nil),  // 5: google.protobuf.FieldMask
}
var file_config_replication_config_proto_depIdxs = []int32{
	0, // 0: config.FileReplicationRule.file_type:type_name -> config.FileType
	1, // 1: config.FileReplicationRule.replication_type:type_name -> config.ReplicationType
	5, // 2: config.FileReplicationRule.destination_fields:type_name -> google.protobuf.FieldMask
	2, // 3: config.FileReplicationRule.string_replacement_rules:type_name -> config.StringReplacementRule
	3, // 4: config.ReplicationConfig.file_replication_rules:type_name -> config.FileReplicationRule
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_config_replication_config_proto_init() }
func file_config_replication_config_proto_init() {
	if File_config_replication_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_config_replication_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StringReplacementRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_config_replication_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FileReplicationRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_config_replication_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReplicationConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_config_replication_config_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_config_replication_config_proto_goTypes,
		DependencyIndexes: file_config_replication_config_proto_depIdxs,
		EnumInfos:         file_config_replication_config_proto_enumTypes,
		MessageInfos:      file_config_replication_config_proto_msgTypes,
	}.Build()
	File_config_replication_config_proto = out.File
	file_config_replication_config_proto_rawDesc = nil
	file_config_replication_config_proto_goTypes = nil
	file_config_replication_config_proto_depIdxs = nil
}
