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