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

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
}

// 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, 0xe4, 0x02, 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, 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
}
