// 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.27.1
// 	protoc        v3.13.0
// source: set_artifacts.proto

package proto

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

// SetArtifacts contains information about the manifests and other metadata
// produced by `fint set`.
type SetArtifacts struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A brief error log populated in case of a recognized failure mode (e.g.
	// `gn gen` failure due to a broken build graph).
	FailureSummary string `protobuf:"bytes,1,opt,name=failure_summary,json=failureSummary,proto3" json:"failure_summary,omitempty"`
	// The path to the `gn gen` tracelog.
	GnTracePath string `protobuf:"bytes,2,opt,name=gn_trace_path,json=gnTracePath,proto3" json:"gn_trace_path,omitempty"`
	// Whether the caller can skip calling `fint build`, based on the changed
	// files included in the context spec. Will always be false unless the
	// static spec's `skip_if_unaffected` field is set.
	SkipBuild bool `protobuf:"varint,3,opt,name=skip_build,json=skipBuild,proto3" json:"skip_build,omitempty"`
	// Whether the caller should set up Goma before invoking `fint build`.
	UseGoma  bool                   `protobuf:"varint,4,opt,name=use_goma,json=useGoma,proto3" json:"use_goma,omitempty"`
	Metadata *SetArtifacts_Metadata `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"`
	// Where the caller should set up reproxy (RBE) before invoking `find build`.
	EnableRbe bool `protobuf:"varint,6,opt,name=enable_rbe,json=enableRbe,proto3" json:"enable_rbe,omitempty"`
}

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

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

func (*SetArtifacts) ProtoMessage() {}

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

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

func (x *SetArtifacts) GetGnTracePath() string {
	if x != nil {
		return x.GnTracePath
	}
	return ""
}

func (x *SetArtifacts) GetSkipBuild() bool {
	if x != nil {
		return x.SkipBuild
	}
	return false
}

func (x *SetArtifacts) GetUseGoma() bool {
	if x != nil {
		return x.UseGoma
	}
	return false
}

func (x *SetArtifacts) GetMetadata() *SetArtifacts_Metadata {
	if x != nil {
		return x.Metadata
	}
	return nil
}

func (x *SetArtifacts) GetEnableRbe() bool {
	if x != nil {
		return x.EnableRbe
	}
	return false
}

// Metadata contains `fint set` parameters that are needed for
// post-processing steps by users of fint. We expose all of these values as
// strings, even `optimize` and `target_arch` (which are enums in
// static.proto), to make processing easier for consumers.
type SetArtifacts_Metadata struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Board      string   `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	Optimize   string   `protobuf:"bytes,2,opt,name=optimize,proto3" json:"optimize,omitempty"`
	Product    string   `protobuf:"bytes,3,opt,name=product,proto3" json:"product,omitempty"`
	TargetArch string   `protobuf:"bytes,4,opt,name=target_arch,json=targetArch,proto3" json:"target_arch,omitempty"`
	Variants   []string `protobuf:"bytes,5,rep,name=variants,proto3" json:"variants,omitempty"`
}

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

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

func (*SetArtifacts_Metadata) ProtoMessage() {}

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

func (x *SetArtifacts_Metadata) GetBoard() string {
	if x != nil {
		return x.Board
	}
	return ""
}

func (x *SetArtifacts_Metadata) GetOptimize() string {
	if x != nil {
		return x.Optimize
	}
	return ""
}

func (x *SetArtifacts_Metadata) GetProduct() string {
	if x != nil {
		return x.Product
	}
	return ""
}

func (x *SetArtifacts_Metadata) GetTargetArch() string {
	if x != nil {
		return x.TargetArch
	}
	return ""
}

func (x *SetArtifacts_Metadata) GetVariants() []string {
	if x != nil {
		return x.Variants
	}
	return nil
}

var File_set_artifacts_proto protoreflect.FileDescriptor

var file_set_artifacts_proto_rawDesc = []byte{
	0x0a, 0x13, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x66, 0x69, 0x6e, 0x74, 0x22, 0x83, 0x03, 0x0a, 0x0c,
	0x53, 0x65, 0x74, 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, 0x22, 0x0a, 0x0d, 0x67, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x63,
	0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x6e,
	0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69,
	0x70, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73,
	0x6b, 0x69, 0x70, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f,
	0x67, 0x6f, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x47,
	0x6f, 0x6d, 0x61, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74,
	0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
	0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a,
	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x62, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x62, 0x65, 0x1a, 0x93, 0x01, 0x0a, 0x08,
	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x61, 0x72,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x1a,
	0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
	0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f,
	0x64, 0x75, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61,
	0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
	0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
	0x73, 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_set_artifacts_proto_rawDescOnce sync.Once
	file_set_artifacts_proto_rawDescData = file_set_artifacts_proto_rawDesc
)

func file_set_artifacts_proto_rawDescGZIP() []byte {
	file_set_artifacts_proto_rawDescOnce.Do(func() {
		file_set_artifacts_proto_rawDescData = protoimpl.X.CompressGZIP(file_set_artifacts_proto_rawDescData)
	})
	return file_set_artifacts_proto_rawDescData
}

var file_set_artifacts_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_set_artifacts_proto_goTypes = []interface{}{
	(*SetArtifacts)(nil),          // 0: fint.SetArtifacts
	(*SetArtifacts_Metadata)(nil), // 1: fint.SetArtifacts.Metadata
}
var file_set_artifacts_proto_depIdxs = []int32{
	1, // 0: fint.SetArtifacts.metadata:type_name -> fint.SetArtifacts.Metadata
	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_set_artifacts_proto_init() }
func file_set_artifacts_proto_init() {
	if File_set_artifacts_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_set_artifacts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SetArtifacts); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_set_artifacts_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SetArtifacts_Metadata); 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_set_artifacts_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_set_artifacts_proto_goTypes,
		DependencyIndexes: file_set_artifacts_proto_depIdxs,
		MessageInfos:      file_set_artifacts_proto_msgTypes,
	}.Build()
	File_set_artifacts_proto = out.File
	file_set_artifacts_proto_rawDesc = nil
	file_set_artifacts_proto_goTypes = nil
	file_set_artifacts_proto_depIdxs = nil
}
