// Copyright 2021 The Fuchsia 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.26.0
// 	protoc        v3.8.0
// source: build_artifacts.proto

package proto

import (
	_struct "github.com/golang/protobuf/ptypes/struct"
	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)
)

// BuildArtifacts contains information about the targets built by `fint build`.
type BuildArtifacts struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A brief error log populated in case of a recognized failure mode (e.g. a
	// Ninja compilation failure).
	FailureSummary string `protobuf:"bytes,1,opt,name=failure_summary,json=failureSummary,proto3" json:"failure_summary,omitempty"`
	// All targets that were passed to Ninja.
	BuiltTargets []string `protobuf:"bytes,2,rep,name=built_targets,json=builtTargets,proto3" json:"built_targets,omitempty"`
	// Images produced by the build. We use a struct to avoid needing to maintain
	// a copy of the images.json schema here.
	BuiltImages []*_struct.Struct `protobuf:"bytes,3,rep,name=built_images,json=builtImages,proto3" json:"built_images,omitempty"`
	// Archives produced by the build. We use a struct to avoid needing to
	// maintain a copy of the images.json schema here.
	BuiltArchives []*_struct.Struct `protobuf:"bytes,4,rep,name=built_archives,json=builtArchives,proto3" json:"built_archives,omitempty"`
	// Zedboot paving images built for ZBI tests. Only populated if ZBI tests were
	// built.
	BuiltZedbootImages []*_struct.Struct `protobuf:"bytes,5,rep,name=built_zedboot_images,json=builtZedbootImages,proto3" json:"built_zedboot_images,omitempty"`
	// Mapping from ZBI test name to QEMU kernel image for the test. Only
	// populated if ZBI tests were built.
	ZbiTestQemuKernelImages map[string]*_struct.Struct `protobuf:"bytes,6,rep,name=zbi_test_qemu_kernel_images,json=zbiTestQemuKernelImages,proto3" json:"zbi_test_qemu_kernel_images,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Absolute path to the Ninja log file.
	NinjaLogPath string `protobuf:"bytes,7,opt,name=ninja_log_path,json=ninjaLogPath,proto3" json:"ninja_log_path,omitempty"`
	// Absolute path to a Ninja graph file.
	NinjaGraphPath string `protobuf:"bytes,8,opt,name=ninja_graph_path,json=ninjaGraphPath,proto3" json:"ninja_graph_path,omitempty"`
	// Absolute path to a Ninja compdb file.
	NinjaCompdbPath string `protobuf:"bytes,9,opt,name=ninja_compdb_path,json=ninjaCompdbPath,proto3" json:"ninja_compdb_path,omitempty"`
}

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

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

func (*BuildArtifacts) ProtoMessage() {}

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

func (x *BuildArtifacts) GetFailureSummary() string {
	if x != nil {
		return x.FailureSummary
	}
	return ""
}

func (x *BuildArtifacts) GetBuiltTargets() []string {
	if x != nil {
		return x.BuiltTargets
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltImages() []*_struct.Struct {
	if x != nil {
		return x.BuiltImages
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltArchives() []*_struct.Struct {
	if x != nil {
		return x.BuiltArchives
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltZedbootImages() []*_struct.Struct {
	if x != nil {
		return x.BuiltZedbootImages
	}
	return nil
}

func (x *BuildArtifacts) GetZbiTestQemuKernelImages() map[string]*_struct.Struct {
	if x != nil {
		return x.ZbiTestQemuKernelImages
	}
	return nil
}

func (x *BuildArtifacts) GetNinjaLogPath() string {
	if x != nil {
		return x.NinjaLogPath
	}
	return ""
}

func (x *BuildArtifacts) GetNinjaGraphPath() string {
	if x != nil {
		return x.NinjaGraphPath
	}
	return ""
}

func (x *BuildArtifacts) GetNinjaCompdbPath() string {
	if x != nil {
		return x.NinjaCompdbPath
	}
	return ""
}

var File_build_artifacts_proto protoreflect.FileDescriptor

var file_build_artifacts_proto_rawDesc = []byte{
	0x0a, 0x15, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x66, 0x69, 0x6e, 0x74, 0x1a, 0x1c, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73,
	0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf7, 0x04, 0x0a, 0x0e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x27,
	0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72,
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
	0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x74,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69,
	0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0e, 0x62, 0x75, 0x69, 0x6c,
	0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x74,
	0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c,
	0x74, 0x5f, 0x7a, 0x65, 0x64, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73,
	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52,
	0x12, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5a, 0x65, 0x64, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61,
	0x67, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x1b, 0x7a, 0x62, 0x69, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x71, 0x65, 0x6d, 0x75, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6d, 0x61, 0x67,
	0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x74, 0x2e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2e, 0x5a,
	0x62, 0x69, 0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c,
	0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x7a, 0x62, 0x69,
	0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x6c, 0x6f,
	0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x69,
	0x6e, 0x6a, 0x61, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x69,
	0x6e, 0x6a, 0x61, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68,
	0x50, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x63, 0x6f,
	0x6d, 0x70, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0f, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68,
	0x1a, 0x63, 0x0a, 0x1c, 0x5a, 0x62, 0x69, 0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b,
	0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
	0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x66, 0x75, 0x63, 0x68,
	0x73, 0x69, 0x61, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x66, 0x75, 0x63, 0x68, 0x73, 0x69, 0x61, 0x2f,
	0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x2f, 0x66, 0x69, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_build_artifacts_proto_rawDescOnce sync.Once
	file_build_artifacts_proto_rawDescData = file_build_artifacts_proto_rawDesc
)

func file_build_artifacts_proto_rawDescGZIP() []byte {
	file_build_artifacts_proto_rawDescOnce.Do(func() {
		file_build_artifacts_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_artifacts_proto_rawDescData)
	})
	return file_build_artifacts_proto_rawDescData
}

var file_build_artifacts_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_build_artifacts_proto_goTypes = []interface{}{
	(*BuildArtifacts)(nil), // 0: fint.BuildArtifacts
	nil,                    // 1: fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry
	(*_struct.Struct)(nil), // 2: google.protobuf.Struct
}
var file_build_artifacts_proto_depIdxs = []int32{
	2, // 0: fint.BuildArtifacts.built_images:type_name -> google.protobuf.Struct
	2, // 1: fint.BuildArtifacts.built_archives:type_name -> google.protobuf.Struct
	2, // 2: fint.BuildArtifacts.built_zedboot_images:type_name -> google.protobuf.Struct
	1, // 3: fint.BuildArtifacts.zbi_test_qemu_kernel_images:type_name -> fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry
	2, // 4: fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry.value:type_name -> google.protobuf.Struct
	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_build_artifacts_proto_init() }
func file_build_artifacts_proto_init() {
	if File_build_artifacts_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_build_artifacts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildArtifacts); 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_build_artifacts_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_build_artifacts_proto_goTypes,
		DependencyIndexes: file_build_artifacts_proto_depIdxs,
		MessageInfos:      file_build_artifacts_proto_msgTypes,
	}.Build()
	File_build_artifacts_proto = out.File
	file_build_artifacts_proto_rawDesc = nil
	file_build_artifacts_proto_goTypes = nil
	file_build_artifacts_proto_depIdxs = nil
}
