// Copyright 2020 The ChromiumOS Authors
// 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.27.1
// 	protoc        v3.17.1
// source: project_mgmt/config.proto

package project_mgmt

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

type Config struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Programs *ProgramList `protobuf:"bytes,1,opt,name=programs,proto3" json:"programs,omitempty"`
}

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

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

func (*Config) ProtoMessage() {}

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

func (x *Config) GetPrograms() *ProgramList {
	if x != nil {
		return x.Programs
	}
	return nil
}

var File_project_mgmt_config_proto protoreflect.FileDescriptor

var file_project_mgmt_config_proto_rawDesc = []byte{
	0x0a, 0x19, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x70, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x6a, 0x65,
	0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
	0x35, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74,
	0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x70, 0x72,
	0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x38, 0x5a, 0x36, 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, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_project_mgmt_config_proto_rawDescOnce sync.Once
	file_project_mgmt_config_proto_rawDescData = file_project_mgmt_config_proto_rawDesc
)

func file_project_mgmt_config_proto_rawDescGZIP() []byte {
	file_project_mgmt_config_proto_rawDescOnce.Do(func() {
		file_project_mgmt_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_project_mgmt_config_proto_rawDescData)
	})
	return file_project_mgmt_config_proto_rawDescData
}

var file_project_mgmt_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_project_mgmt_config_proto_goTypes = []interface{}{
	(*Config)(nil),      // 0: project_mgmt.Config
	(*ProgramList)(nil), // 1: project_mgmt.ProgramList
}
var file_project_mgmt_config_proto_depIdxs = []int32{
	1, // 0: project_mgmt.Config.programs:type_name -> project_mgmt.ProgramList
	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_project_mgmt_config_proto_init() }
func file_project_mgmt_config_proto_init() {
	if File_project_mgmt_config_proto != nil {
		return
	}
	file_project_mgmt_program_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_project_mgmt_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config); 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_project_mgmt_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_project_mgmt_config_proto_goTypes,
		DependencyIndexes: file_project_mgmt_config_proto_depIdxs,
		MessageInfos:      file_project_mgmt_config_proto_msgTypes,
	}.Build()
	File_project_mgmt_config_proto = out.File
	file_project_mgmt_config_proto_rawDesc = nil
	file_project_mgmt_config_proto_goTypes = nil
	file_project_mgmt_config_proto_depIdxs = nil
}
