summaryrefslogtreecommitdiffstats
path: root/internal/assert
diff options
context:
space:
mode:
Diffstat (limited to 'internal/assert')
-rw-r--r--internal/assert/assert.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/internal/assert/assert.go b/internal/assert/assert.go
new file mode 100644
index 0000000..cb0063c
--- /dev/null
+++ b/internal/assert/assert.go
@@ -0,0 +1,36 @@
+// Package assert provides programmer-error checks that abort the process.
+//
+// An assertion failure is never a user error: it means the program reached a
+// state its author believed impossible. User errors are returned as values.
+package assert
+
+import "fmt"
+
+// True aborts unless cond holds.
+func True(cond bool, format string, args ...any) {
+ if !cond {
+ panic("assertion failed: " + fmt.Sprintf(format, args...))
+ }
+}
+
+// Equal aborts unless got == want.
+func Equal[T comparable](got, want T, format string, args ...any) {
+ if got != want {
+ panic(fmt.Sprintf("assertion failed: %s: got %v, want %v",
+ fmt.Sprintf(format, args...), got, want))
+ }
+}
+
+// NoError aborts if err is non-nil. Use only where an error is structurally
+// impossible, never to discard an error a caller could handle.
+func NoError(err error, format string, args ...any) {
+ if err != nil {
+ panic(fmt.Sprintf("assertion failed: %s: %v",
+ fmt.Sprintf(format, args...), err))
+ }
+}
+
+// Unreachable aborts unconditionally.
+func Unreachable(format string, args ...any) {
+ panic("unreachable: " + fmt.Sprintf(format, args...))
+}