// Code generated by protoc-gen-go. DO NOT EDIT.
// source: dmi/commons.proto

package dmi

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

type Status int32

const (
	Status_UNDEFINED_STATUS Status = 0
	Status_OK_STATUS        Status = 1
	Status_ERROR_STATUS     Status = 2
)

var Status_name = map[int32]string{
	0: "UNDEFINED_STATUS",
	1: "OK_STATUS",
	2: "ERROR_STATUS",
}

var Status_value = map[string]int32{
	"UNDEFINED_STATUS": 0,
	"OK_STATUS":        1,
	"ERROR_STATUS":     2,
}

func (x Status) String() string {
	return proto.EnumName(Status_name, int32(x))
}

func (Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_74aedf0dda1205d8, []int{0}
}

//Log Level
type LogLevel int32

const (
	LogLevel_TRACE LogLevel = 0
	LogLevel_DEBUG LogLevel = 1
	LogLevel_INFO  LogLevel = 2
	LogLevel_WARN  LogLevel = 3
	LogLevel_ERROR LogLevel = 4
)

var LogLevel_name = map[int32]string{
	0: "TRACE",
	1: "DEBUG",
	2: "INFO",
	3: "WARN",
	4: "ERROR",
}

var LogLevel_value = map[string]int32{
	"TRACE": 0,
	"DEBUG": 1,
	"INFO":  2,
	"WARN":  3,
	"ERROR": 4,
}

func (x LogLevel) String() string {
	return proto.EnumName(LogLevel_name, int32(x))
}

func (LogLevel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_74aedf0dda1205d8, []int{1}
}

func init() {
	proto.RegisterEnum("dmi.Status", Status_name, Status_value)
	proto.RegisterEnum("dmi.LogLevel", LogLevel_name, LogLevel_value)
}

func init() { proto.RegisterFile("dmi/commons.proto", fileDescriptor_74aedf0dda1205d8) }

var fileDescriptor_74aedf0dda1205d8 = []byte{
	// 217 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x34, 0x8f, 0x5f, 0x6b, 0xc2, 0x30,
	0x14, 0xc5, 0xfd, 0x37, 0xd1, 0xb0, 0xc1, 0x5d, 0xd8, 0xa7, 0x10, 0x34, 0x0f, 0x3e, 0x8d, 0x3d,
	0x48, 0x5d, 0xe3, 0x90, 0x49, 0x0b, 0x69, 0xcb, 0x60, 0x2f, 0xa3, 0x26, 0x77, 0x5d, 0x60, 0x37,
	0x57, 0x6a, 0xec, 0xe7, 0x97, 0x0a, 0xbe, 0xfd, 0xce, 0x39, 0x70, 0xe0, 0x27, 0x9e, 0x1d, 0x79,
	0x65, 0x99, 0x88, 0xc3, 0x79, 0x75, 0x6a, 0x39, 0xb2, 0x1c, 0x3b, 0xf2, 0x8b, 0x8d, 0x98, 0x16,
	0xb1, 0x8e, 0x97, 0xb3, 0x7c, 0x11, 0x50, 0x65, 0xa9, 0xde, 0xed, 0x33, 0x9d, 0xfe, 0x14, 0x65,
	0x52, 0x56, 0x05, 0x0c, 0xe4, 0x93, 0x98, 0xe7, 0x9f, 0xf7, 0x38, 0x94, 0x20, 0x1e, 0xb5, 0x31,
	0xb9, 0xb9, 0x37, 0xa3, 0xc5, 0x46, 0xcc, 0x0e, 0xdc, 0x1c, 0xb0, 0xc3, 0x7f, 0x39, 0x17, 0x0f,
	0xa5, 0x49, 0xde, 0x35, 0x0c, 0x7a, 0x4c, 0xf5, 0xb6, 0xfa, 0x80, 0xa1, 0x9c, 0x89, 0xc9, 0x3e,
	0xdb, 0xe5, 0x30, 0xea, 0xe9, 0x2b, 0x31, 0x19, 0x8c, 0xfb, 0xf9, 0xf6, 0x03, 0x93, 0xed, 0xdb,
	0xf7, 0x6b, 0xe3, 0xe3, 0xdf, 0xe5, 0xb8, 0xb2, 0x4c, 0x8a, 0x4f, 0x18, 0x2c, 0xb7, 0x4e, 0x39,
	0xec, 0xbc, 0xc5, 0x25, 0xd5, 0xa1, 0x6e, 0x90, 0x30, 0xc4, 0xa5, 0x0f, 0x11, 0xdb, 0xdf, 0xda,
	0xa2, 0xea, 0xd6, 0xaa, 0x61, 0xe5, 0xc8, 0x1f, 0xa7, 0x37, 0x95, 0xf5, 0x35, 0x00, 0x00, 0xff,
	0xff, 0x6b, 0x43, 0x1e, 0x6c, 0xdf, 0x00, 0x00, 0x00,
}
