// 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"`
	// The duration taken by the ninja build step.
	NinjaDurationSeconds int32 `protobuf:"varint,10,opt,name=ninja_duration_seconds,json=ninjaDurationSeconds,proto3" json:"ninja_duration_seconds,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 ""
}

func (x *BuildArtifacts) GetNinjaDurationSeconds() int32 {
	if x != nil {
		return x.NinjaDurationSeconds
	}
	return 0
}

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, 0xad, 0x05, 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,
	0x12, 0x34, 0x0a, 0x16, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x14, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
	0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 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
}
