// Copyright 2020 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: testplans/slim_build_config.proto

package testplans

import (
	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)
)

// Configures the scheduling of slim CQ builds when the triggering CLs only
// affect paths which are eligible for slim builds.
type SlimBuildCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// File patterns that are eligible for slim builds.
	// See documentation in the FilePattern message.
	SlimEligibleFilePatterns []*FilePattern `protobuf:"bytes,1,rep,name=slim_eligible_file_patterns,json=slimEligibleFilePatterns,proto3" json:"slim_eligible_file_patterns,omitempty"`
}

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

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

func (*SlimBuildCfg) ProtoMessage() {}

func (x *SlimBuildCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_slim_build_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 SlimBuildCfg.ProtoReflect.Descriptor instead.
func (*SlimBuildCfg) Descriptor() ([]byte, []int) {
	return file_testplans_slim_build_config_proto_rawDescGZIP(), []int{0}
}

func (x *SlimBuildCfg) GetSlimEligibleFilePatterns() []*FilePattern {
	if x != nil {
		return x.SlimEligibleFilePatterns
	}
	return nil
}

var File_testplans_slim_build_config_proto protoreflect.FileDescriptor

var file_testplans_slim_build_config_proto_rawDesc = []byte{
	0x0a, 0x21, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x73, 0x6c, 0x69, 0x6d,
	0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a, 0x16,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x65, 0x0a, 0x0c, 0x53, 0x6c, 0x69, 0x6d, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x43, 0x66, 0x67, 0x12, 0x55, 0x0a, 0x1b, 0x73, 0x6c, 0x69, 0x6d, 0x5f, 0x65,
	0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74,
	0x74, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74,
	0x65, 0x72, 0x6e, 0x52, 0x18, 0x73, 0x6c, 0x69, 0x6d, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c,
	0x65, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x42, 0x35, 0x5a,
	0x33, 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, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_slim_build_config_proto_rawDescOnce sync.Once
	file_testplans_slim_build_config_proto_rawDescData = file_testplans_slim_build_config_proto_rawDesc
)

func file_testplans_slim_build_config_proto_rawDescGZIP() []byte {
	file_testplans_slim_build_config_proto_rawDescOnce.Do(func() {
		file_testplans_slim_build_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_slim_build_config_proto_rawDescData)
	})
	return file_testplans_slim_build_config_proto_rawDescData
}

var file_testplans_slim_build_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_testplans_slim_build_config_proto_goTypes = []interface{}{
	(*SlimBuildCfg)(nil), // 0: testplans.SlimBuildCfg
	(*FilePattern)(nil),  // 1: testplans.FilePattern
}
var file_testplans_slim_build_config_proto_depIdxs = []int32{
	1, // 0: testplans.SlimBuildCfg.slim_eligible_file_patterns:type_name -> testplans.FilePattern
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_testplans_slim_build_config_proto_init() }
func file_testplans_slim_build_config_proto_init() {
	if File_testplans_slim_build_config_proto != nil {
		return
	}
	file_testplans_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_testplans_slim_build_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SlimBuildCfg); 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_testplans_slim_build_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_slim_build_config_proto_goTypes,
		DependencyIndexes: file_testplans_slim_build_config_proto_depIdxs,
		MessageInfos:      file_testplans_slim_build_config_proto_msgTypes,
	}.Build()
	File_testplans_slim_build_config_proto = out.File
	file_testplans_slim_build_config_proto_rawDesc = nil
	file_testplans_slim_build_config_proto_goTypes = nil
	file_testplans_slim_build_config_proto_depIdxs = nil
}
