Some basic libraries for use

This commit is contained in:
spsobole 2023-05-18 22:12:21 -06:00
parent 999d32ea5a
commit 8f2da7be66
8 changed files with 277 additions and 0 deletions

36
cerror/code.go Normal file
View File

@ -0,0 +1,36 @@
package cerror
import (
"git.twelvetwelve.org/library/core/log"
)
var codes = make(map[string]*Code)
type Code struct {
code string
}
func (c *Code) Error() string {
return c.code
}
func NewCode(urn string) *Code {
if _, ok := codes[urn]; ok {
log.Panicf("error code %s already exists", urn)
}
code := &Code{
code: urn,
}
codes[urn] = code
return code
}
func GetCode(urn string) *Code {
if code, ok := codes[urn]; ok {
return code
}
log.Panicf("error code %s does not exist", urn)
return nil
}

33
cerror/error.go Normal file
View File

@ -0,0 +1,33 @@
package cerror
import (
"fmt"
)
type Error struct {
code *Code
msg string
kv map[string]interface{}
}
func (e *Error) Code() *Code {
return e.code
}
func (e *Error) Error() string {
return fmt.Sprintf("%s:%s", e.code, e.msg)
}
func (e *Error) KV(k string, v interface{}) {
e.kv[k] = v
}
func New(code *Code, message string) *Error {
e := &Error{
code: code,
msg: message,
kv: make(map[string]interface{}),
}
return e
}

23
cerror/error_test.go Normal file
View File

@ -0,0 +1,23 @@
package cerror
import (
"testing"
"git.twelvetwelve.org/library/core/testutil/assert"
)
func TestError_Errors(t *testing.T) {
c := NewCode("org.twelvetwelve.one")
assert.NotNil(t, c)
e := New(c, "something went wrong")
assert.NotNil(t, e)
assert.Equal(t, e.Code(), c)
assert.WillPanic(t, func() { _ = NewCode("org.twelvetwelve.one") })
assert.WillPanic(t, func() { _ = GetCode("org.twelvetwelve.two") })
c2 := NewCode("org.twelvetwelve.two")
assert.NotNil(t, c2)
assert.NotEqual(t, c, c2)
}

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module git.twelvetwelve.org/library/core
go 1.20

42
log/default.go Normal file
View File

@ -0,0 +1,42 @@
package log
var Default = &Log{
fmtTime: "2006-01-02 15:04:05",
level: LogAll,
}
func Printf(s string, v ...interface{}) {
Default.Printf(s, v...)
}
func Panicf(s string, v ...interface{}) {
Default.Panicf(s, v...)
}
func Fatalf(s string, v ...interface{}) {
Default.Fatalf(s, v...)
}
func Infof(s string, v ...interface{}) {
Default.Infof(s, v...)
}
func Eventf(s string, v ...interface{}) {
Default.Eventf(s, v...)
}
func Warnf(s string, v ...interface{}) {
Default.Warnf(s, v...)
}
func Debugf(s string, v ...interface{}) {
Default.Debugf(s, v...)
}
func Highlightf(s string, v ...interface{}) {
Default.Highlightf(s, v...)
}
func Errorf(s string, v ...interface{}) {
Default.Errorf(s, v...)
}

13
log/interface.go Normal file
View File

@ -0,0 +1,13 @@
package log
type Logger interface {
Printf(s string, v ...interface{})
Panicf(s string, v ...interface{})
Fatalf(s string, v ...interface{})
Infof(s string, v ...interface{})
Eventf(s string, v ...interface{})
Warnf(s string, v ...interface{})
Debugf(s string, v ...interface{})
Highlightf(s string, v ...interface{})
Errorf(s string, v ...interface{})
}

97
log/log.go Normal file
View File

@ -0,0 +1,97 @@
package log
import (
"fmt"
"os"
"time"
)
const (
ColorReset = "\033[0m"
ColorRed = "\033[31m"
ColorGreen = "\033[32m"
ColorYellow = "\033[33m"
ColorCyan = "\033[36m"
ColorGray = "\033[2;37m"
)
const (
LogError = 1 << iota
LogWarn
LogEvent
LogInfo
LogHighlight
LogPrint
LogDebug
LogAll = LogError | LogWarn | LogEvent | LogInfo | LogHighlight | LogPrint | LogDebug
)
type Log struct {
fmtTime string
level uint32
}
func (l *Log) Printf(s string, v ...interface{}) {
if l.level&LogPrint == LogPrint {
l.ColorPrint(ColorGray, fmt.Sprintf(s, v...))
}
}
func (l *Log) Panicf(s string, v ...interface{}) {
panic(fmt.Sprintf(s, v...))
}
func (l *Log) Fatalf(s string, v ...interface{}) {
l.ColorPrint(ColorRed, fmt.Sprintf(s, v...))
os.Exit(1)
}
func (l *Log) Infof(s string, v ...interface{}) {
if l.level&LogInfo == LogInfo {
l.ColorPrint(ColorReset, fmt.Sprintf(s, v...))
}
}
func (l *Log) Eventf(s string, v ...interface{}) {
if l.level&LogEvent == LogEvent {
l.ColorPrint(ColorCyan, fmt.Sprintf(s, v...))
}
}
func (l *Log) Warnf(s string, v ...interface{}) {
if l.level&LogWarn == LogWarn {
l.ColorPrint(ColorYellow, fmt.Sprintf(s, v...))
}
}
func (l *Log) Debugf(s string, v ...interface{}) {
if l.level&LogDebug == LogDebug {
l.ColorPrint(ColorGray, fmt.Sprintf(s, v...))
}
}
func (l *Log) Highlightf(s string, v ...interface{}) {
if l.level&LogHighlight == LogHighlight {
l.ColorPrint(ColorGreen, fmt.Sprintf(s, v...))
}
}
func (l *Log) Errorf(s string, v ...interface{}) {
if l.level&LogHighlight == LogHighlight {
l.ColorPrint(ColorRed, fmt.Sprintf(s, v...))
}
}
func (l *Log) ColorPrint(color string, s string) {
now := time.Now() // get this early.
fmt.Fprintf(os.Stdout, "%s | %s%s%s", now.Format(l.fmtTime), color, s, ColorReset)
}
func (l *Log) SetLevel(level uint32) {
l.level = level
}
func (l *Log) SetTimeFormat(fmt string) {
l.fmtTime = fmt
}

View File

@ -0,0 +1,30 @@
package assert
import (
"testing"
)
func WillPanic(t *testing.T, f func()) {
t.Helper()
defer func() { _ = recover() }()
f()
t.Fatalf("should have panicked")
}
func Equal(t *testing.T, expect, check interface{}) {
if expect != check {
t.Fatalf("%v:%v not equal", expect, check)
}
}
func NotEqual(t *testing.T, expect, check interface{}) {
if expect == check {
t.Fatalf("%v:%v equal", expect, check)
}
}
func NotNil(t *testing.T, v interface{}) {
if v == nil {
t.Fatalf("nil")
}
}