github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/boblog/boblog.go (about)

     1  package boblog
     2  
     3  // rough logr.Logger implementation
     4  // to be replaced with "logging"-branch
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"github.com/benchkram/bob/pkg/usererror"
    10  	"unicode"
    11  
    12  	"github.com/benchkram/errz"
    13  	"github.com/logrusorgru/aurora"
    14  )
    15  
    16  var Log = log{level: 0}
    17  
    18  var globalLogLevel = 1
    19  
    20  func SetLogLevel(level int) {
    21  	if level < 0 {
    22  		level = 0
    23  	}
    24  	globalLogLevel = level
    25  }
    26  
    27  type log struct {
    28  	level int
    29  }
    30  
    31  func (l log) V(level int) log {
    32  	if level < 0 {
    33  		return l
    34  	}
    35  
    36  	l.level = l.level + level
    37  	return l
    38  }
    39  
    40  func (l log) Info(msg string) {
    41  	if l.level > globalLogLevel {
    42  		return
    43  	}
    44  	fmt.Println(msg)
    45  }
    46  
    47  func (l log) Error(err error, msg string, keysAndValues ...interface{}) {
    48  	// Only log if there's actually an error
    49  	if err == nil {
    50  		return
    51  	}
    52  
    53  	// Error message will always be logged if exists
    54  	fmt.Print(aurora.Red(msg + ": "))
    55  
    56  	// Stack trace will only be logged if globalLogLevel >= 2
    57  	if globalLogLevel >= 2 {
    58  		errz.Log(err)
    59  	} else {
    60  		for {
    61  			er := errors.Unwrap(err)
    62  			if er == nil {
    63  				break
    64  			}
    65  
    66  			err = er
    67  		}
    68  
    69  		fmt.Println(aurora.Red(err))
    70  	}
    71  }
    72  
    73  // UserError is intended to present errors to the user
    74  // should go into a cli beatify package in the future..
    75  func (l log) UserError(err error) {
    76  	if err == nil {
    77  		return
    78  	}
    79  
    80  	var uerr *usererror.E
    81  	er := err
    82  	for {
    83  		if errors.As(er, &uerr) {
    84  			err = uerr
    85  			break
    86  		}
    87  
    88  		er = errors.Unwrap(er)
    89  		if er == nil {
    90  			break
    91  		}
    92  	}
    93  
    94  	msg := err.Error()
    95  
    96  	if msg != "" {
    97  		tmp := []rune(msg)
    98  		tmp[0] = unicode.ToUpper(tmp[0])
    99  		msg = string(tmp)
   100  	}
   101  
   102  	fmt.Println(aurora.Red(msg))
   103  }