diff options
| author | Kyren223 <ulmliad223@gmail.com> | 2024-10-20 20:12:12 +0300 |
|---|---|---|
| committer | Kyren223 <ulmliad223@gmail.com> | 2024-10-20 20:12:12 +0300 |
| commit | 6f83f199f8311bf7782da59bc2e07df38073e65a (patch) | |
| tree | 8cfbe0a551bea927cf1c7f23bf5753f8ddf0ce46 /pkg/assert/assert.go | |
| parent | 1997bc8a150b92783060cc7129e1ee72a761182b (diff) | |
refactor: finished refactoring server-side code
Diffstat (limited to 'pkg/assert/assert.go')
| -rw-r--r-- | pkg/assert/assert.go | 89 |
1 files changed, 79 insertions, 10 deletions
diff --git a/pkg/assert/assert.go b/pkg/assert/assert.go index 7281a95..65fe088 100644 --- a/pkg/assert/assert.go +++ b/pkg/assert/assert.go @@ -1,25 +1,94 @@ package assert -import "log" +import ( + "fmt" + "io" + "os" + "reflect" + "runtime/debug" + "sync" +) -func Assert(assertion bool, message string, a ...any) { +var ( + writer io.Writer = os.Stderr + + flushes = []io.Closer{} + flushMu sync.Mutex + + assertData = map[string]any{} + mapMu sync.Mutex +) + +func AddData(key string, value any) { + mapMu.Lock() + assertData[key] = value + mapMu.Unlock() +} + +func RemoveData(key string) { + mapMu.Lock() + delete(assertData, key) + mapMu.Unlock() +} + +func AddFlush(flusher io.Closer) { + flushMu.Lock() + flushes = append(flushes, flusher) + flushMu.Unlock() +} + +func SetWriter(w io.Writer) { + writer = w +} + +func runAssert(message string, args ...any) { + flushMu.Lock() + for len(flushes) != 0 { + flusher := flushes[len(flushes)-1] + flusher.Close() + flushes = flushes[:len(flushes)-1] + } + flushMu.Unlock() + + values := []any{ + "msg", message, + } + values = append(values, args...) + mapMu.Lock() + for k, v := range assertData { + values = append(values, k, v) + } + mapMu.Unlock() + + fmt.Fprintf(writer, "ARGS: %+v\n", args) + fmt.Fprintf(writer, "ASSERT\n") + for i := 0; i < len(values); i += 2 { + fmt.Fprintf(writer, " %s=%v\n", values[i], values[i+1]) + } + fmt.Fprintln(writer, string(debug.Stack())) + + os.Exit(1) +} + +func Assert(assertion bool, message string, args ...any) { if !assertion { - log.Fatalf(message+"\n", a...) + runAssert(message, args...) } } -func NoError(err error, message string, a ...any) { +func NoError(err error, message string, args ...any) { if err != nil { - log.Fatalf(message+": "+err.Error()+"\n", a...) + args = append(args, "error", err) + runAssert(message, args...) } } -func Never(message string, a ...any) { - log.Fatalf(message+"\n", a...) +func Never(message string, args ...any) { + runAssert(message, args...) } -func NotNil(value any, message string, a ...any) { - if value == nil { - log.Fatalf(message+"\n", a...) +func NotNil(value any, message string, args ...any) { + if value == nil || reflect.ValueOf(value).Kind() == reflect.Ptr && reflect.ValueOf(value).IsNil() { + runAssert(message, args...) } } |
