// Copyright 2020 The Swarming Authors. All rights reserved.
// Use of this source code is governed by the Apache v2.0 license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.17.0
// source: go.chromium.org/luci/buildbucket/proto/builder.proto

package buildbucketpb

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

// Identifies a builder.
// Canonical string representation: "{project}/{bucket}/{builder}".
type BuilderID struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Project ID, e.g. "chromium". Unique within a LUCI deployment.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// Bucket name, e.g. "try". Unique within the project.
	// Together with project, defines an ACL.
	Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Builder name, e.g. "linux-rel". Unique within the bucket.
	Builder string `protobuf:"bytes,3,opt,name=builder,proto3" json:"builder,omitempty"`
}

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

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

func (*BuilderID) ProtoMessage() {}

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

func (x *BuilderID) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *BuilderID) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *BuilderID) GetBuilder() string {
	if x != nil {
		return x.Builder
	}
	return ""
}

// A configured builder.
//
// It is called BuilderItem and not Builder because
// 1) Builder already exists
// 2) Name "Builder" is incompatible with proto->Java compiler.
type BuilderItem struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Uniquely identifies the builder in a given Buildbucket instance.
	Id *BuilderID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// User-supplied configuration after normalization.
	// Does not refer to mixins and has defaults inlined.
	Config *Builder `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
}

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

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

func (*BuilderItem) ProtoMessage() {}

func (x *BuilderItem) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_builder_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 BuilderItem.ProtoReflect.Descriptor instead.
func (*BuilderItem) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescGZIP(), []int{1}
}

func (x *BuilderItem) GetId() *BuilderID {
	if x != nil {
		return x.Id
	}
	return nil
}

func (x *BuilderItem) GetConfig() *Builder {
	if x != nil {
		return x.Config
	}
	return nil
}

var File_go_chromium_org_luci_buildbucket_proto_builder_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDesc = []byte{
	0x0a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63,
	0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x1a, 0x3b, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x22, 0x57, 0x0a, 0x09, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x44,
	0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x0b,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x02, 0x69,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
	0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x06, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescData = file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDesc
)

func file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescData)
	})
	return file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDescData
}

var file_go_chromium_org_luci_buildbucket_proto_builder_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_go_chromium_org_luci_buildbucket_proto_builder_proto_goTypes = []interface{}{
	(*BuilderID)(nil),   // 0: buildbucket.v2.BuilderID
	(*BuilderItem)(nil), // 1: buildbucket.v2.BuilderItem
	(*Builder)(nil),     // 2: buildbucket.Builder
}
var file_go_chromium_org_luci_buildbucket_proto_builder_proto_depIdxs = []int32{
	0, // 0: buildbucket.v2.BuilderItem.id:type_name -> buildbucket.v2.BuilderID
	2, // 1: buildbucket.v2.BuilderItem.config:type_name -> buildbucket.Builder
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_buildbucket_proto_builder_proto_init() }
func file_go_chromium_org_luci_buildbucket_proto_builder_proto_init() {
	if File_go_chromium_org_luci_buildbucket_proto_builder_proto != nil {
		return
	}
	file_go_chromium_org_luci_buildbucket_proto_project_config_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_buildbucket_proto_builder_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuilderID); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_buildbucket_proto_builder_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuilderItem); 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_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_buildbucket_proto_builder_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_buildbucket_proto_builder_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_buildbucket_proto_builder_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_buildbucket_proto_builder_proto = out.File
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_rawDesc = nil
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_goTypes = nil
	file_go_chromium_org_luci_buildbucket_proto_builder_proto_depIdxs = nil
}
