// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/builder_config.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	software "go.chromium.org/chromiumos/config/go/api/software"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Defines a builder from platform's point of view.
type BuilderConfig struct {
	// Whether this builder should be considered criticial.
	Critical bool `protobuf:"varint,1,opt,name=critical,proto3" json:"critical,omitempty"`
	// Defines the build target for this builder config.
	BuildTarget          *software.SystemImage_BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *BuilderConfig) Reset()         { *m = BuilderConfig{} }
func (m *BuilderConfig) String() string { return proto.CompactTextString(m) }
func (*BuilderConfig) ProtoMessage()    {}
func (*BuilderConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_3f63408d3c1e26ca, []int{0}
}

func (m *BuilderConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuilderConfig.Unmarshal(m, b)
}
func (m *BuilderConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuilderConfig.Marshal(b, m, deterministic)
}
func (m *BuilderConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuilderConfig.Merge(m, src)
}
func (m *BuilderConfig) XXX_Size() int {
	return xxx_messageInfo_BuilderConfig.Size(m)
}
func (m *BuilderConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_BuilderConfig.DiscardUnknown(m)
}

var xxx_messageInfo_BuilderConfig proto.InternalMessageInfo

func (m *BuilderConfig) GetCritical() bool {
	if m != nil {
		return m.Critical
	}
	return false
}

func (m *BuilderConfig) GetBuildTarget() *software.SystemImage_BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func init() {
	proto.RegisterType((*BuilderConfig)(nil), "prototype.BuilderConfig")
}

func init() { proto.RegisterFile("prototype/builder_config.proto", fileDescriptor_3f63408d3c1e26ca) }

var fileDescriptor_3f63408d3c1e26ca = []byte{
	// 214 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8f, 0x31, 0x4f, 0xc3, 0x30,
	0x10, 0x85, 0x65, 0x06, 0x54, 0x5c, 0x58, 0x32, 0x55, 0x1d, 0x50, 0xc5, 0xd4, 0xc9, 0x27, 0xa8,
	0x10, 0x7b, 0x99, 0x58, 0x0b, 0x53, 0x97, 0xc8, 0x31, 0x8e, 0x39, 0xa9, 0xee, 0x59, 0x67, 0x47,
	0x28, 0xbf, 0x80, 0xbf, 0x8d, 0x74, 0x01, 0xa7, 0x9b, 0x4f, 0xcf, 0xef, 0x7d, 0xef, 0xe9, 0xfb,
	0xc4, 0x54, 0xa8, 0x8c, 0xc9, 0x43, 0x37, 0xe0, 0xe9, 0xd3, 0x73, 0xeb, 0xe8, 0xdc, 0x63, 0x30,
	0x22, 0x34, 0x37, 0x55, 0x5f, 0x3f, 0xba, 0x2f, 0xa6, 0x88, 0x43, 0xa4, 0x0c, 0xd3, 0x1f, 0xb0,
	0x09, 0x21, 0x53, 0x5f, 0xbe, 0x2d, 0x7b, 0xc8, 0x63, 0x2e, 0x3e, 0xb6, 0x18, 0x6d, 0xf0, 0x93,
	0xfb, 0xe1, 0x47, 0xe9, 0xbb, 0xfd, 0x14, 0xfb, 0x2a, 0x8e, 0x66, 0xad, 0x17, 0x8e, 0xb1, 0xa0,
	0xb3, 0xa7, 0x95, 0xda, 0xa8, 0xed, 0xe2, 0x50, 0xef, 0xe6, 0xa8, 0x6f, 0xa5, 0x43, 0x5b, 0x2c,
	0x07, 0x5f, 0x56, 0x57, 0x1b, 0xb5, 0x5d, 0x3e, 0xbd, 0x98, 0x99, 0x6b, 0xfe, 0xba, 0xd9, 0x84,
	0xe6, 0x9f, 0x6b, 0xde, 0x85, 0xfb, 0x26, 0x58, 0x81, 0x7d, 0x88, 0xfd, 0xb0, 0xec, 0xe6, 0x63,
	0xff, 0x7c, 0xdc, 0x05, 0xaa, 0x49, 0x86, 0x38, 0xc0, 0xc5, 0x1c, 0x3c, 0xf7, 0x6c, 0x41, 0x3a,
	0x43, 0x20, 0xa8, 0x9b, 0xbb, 0x6b, 0x79, 0xee, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x87, 0xfd,
	0x8a, 0x5b, 0x27, 0x01, 0x00, 0x00,
}
