github.com/MetalBlockchain/metalgo@v1.11.9/utils/logging/level.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package logging
     5  
     6  import (
     7  	"encoding/json"
     8  	"errors"
     9  	"fmt"
    10  	"strings"
    11  
    12  	"go.uber.org/zap/zapcore"
    13  )
    14  
    15  type Level zapcore.Level
    16  
    17  const (
    18  	Verbo Level = iota - 9
    19  	Debug
    20  	Trace
    21  	Info
    22  	Warn
    23  	Error
    24  	Fatal
    25  	Off
    26  
    27  	fatalStr   = "FATAL"
    28  	errorStr   = "ERROR"
    29  	warnStr    = "WARN"
    30  	infoStr    = "INFO"
    31  	traceStr   = "TRACE"
    32  	debugStr   = "DEBUG"
    33  	verboStr   = "VERBO"
    34  	offStr     = "OFF"
    35  	unknownStr = "UNKNO"
    36  
    37  	fatalLowStr   = "fatal"
    38  	errorLowStr   = "error"
    39  	warnLowStr    = "warn"
    40  	infoLowStr    = "info"
    41  	traceLowStr   = "trace"
    42  	debugLowStr   = "debug"
    43  	verboLowStr   = "verbo"
    44  	offLowStr     = "off"
    45  	unknownLowStr = "unkno"
    46  )
    47  
    48  var ErrUnknownLevel = errors.New("unknown log level")
    49  
    50  // Inverse of Level.String()
    51  func ToLevel(l string) (Level, error) {
    52  	switch strings.ToUpper(l) {
    53  	case offStr:
    54  		return Off, nil
    55  	case fatalStr:
    56  		return Fatal, nil
    57  	case errorStr:
    58  		return Error, nil
    59  	case warnStr:
    60  		return Warn, nil
    61  	case infoStr:
    62  		return Info, nil
    63  	case traceStr:
    64  		return Trace, nil
    65  	case debugStr:
    66  		return Debug, nil
    67  	case verboStr:
    68  		return Verbo, nil
    69  	default:
    70  		return Off, fmt.Errorf("%w: %q", ErrUnknownLevel, l)
    71  	}
    72  }
    73  
    74  func (l Level) String() string {
    75  	switch l {
    76  	case Off:
    77  		return offStr
    78  	case Fatal:
    79  		return fatalStr
    80  	case Error:
    81  		return errorStr
    82  	case Warn:
    83  		return warnStr
    84  	case Info:
    85  		return infoStr
    86  	case Trace:
    87  		return traceStr
    88  	case Debug:
    89  		return debugStr
    90  	case Verbo:
    91  		return verboStr
    92  	default:
    93  		// This should never happen
    94  		return unknownStr
    95  	}
    96  }
    97  
    98  func (l Level) LowerString() string {
    99  	switch l {
   100  	case Off:
   101  		return offLowStr
   102  	case Fatal:
   103  		return fatalLowStr
   104  	case Error:
   105  		return errorLowStr
   106  	case Warn:
   107  		return warnLowStr
   108  	case Info:
   109  		return infoLowStr
   110  	case Trace:
   111  		return traceLowStr
   112  	case Debug:
   113  		return debugLowStr
   114  	case Verbo:
   115  		return verboLowStr
   116  	default:
   117  		// This should never happen
   118  		return unknownLowStr
   119  	}
   120  }
   121  
   122  func (l Level) MarshalJSON() ([]byte, error) {
   123  	return json.Marshal(l.String())
   124  }
   125  
   126  func (l *Level) UnmarshalJSON(b []byte) error {
   127  	var str string
   128  	if err := json.Unmarshal(b, &str); err != nil {
   129  		return err
   130  	}
   131  	var err error
   132  	*l, err = ToLevel(str)
   133  	return err
   134  }