fortify: move error handling to separate file
Error handling here is way too monstrous due to terrible design of the internal/app package. Since rewriting internal/app will take a while, error handling is moved out of main to improve readability. Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
This commit is contained in:
parent
61b473a06f
commit
d5c26ae593
|
@ -0,0 +1,61 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"git.ophivana.moe/cat/fortify/internal/app"
|
||||
)
|
||||
|
||||
func logWaitError(err error) {
|
||||
var e *app.BaseError
|
||||
if !app.AsBaseError(err, &e) {
|
||||
fmt.Println("fortify: wait failed:", err)
|
||||
} else {
|
||||
// Wait only returns either *app.ProcessError or *app.StateStoreError wrapped in a *app.BaseError
|
||||
var se *app.StateStoreError
|
||||
if !errors.As(err, &se) {
|
||||
// does not need special handling
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
// inner error are either unwrapped store errors
|
||||
// or joined errors returned by *appSealTx revert
|
||||
// wrapped in *app.BaseError
|
||||
var ej app.RevertCompoundError
|
||||
if !errors.As(se.InnerErr, &ej) {
|
||||
// does not require special handling
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
errs := ej.Unwrap()
|
||||
|
||||
// every error here is wrapped in *app.BaseError
|
||||
for _, ei := range errs {
|
||||
var eb *app.BaseError
|
||||
if !errors.As(ei, &eb) {
|
||||
// unreachable
|
||||
fmt.Println("fortify: invalid error type returned by revert:", ei)
|
||||
} else {
|
||||
// print inner *app.BaseError message
|
||||
fmt.Print("fortify: " + eb.Message())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func logBaseError(err error, message string) {
|
||||
var e *app.BaseError
|
||||
|
||||
if app.AsBaseError(err, &e) {
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
fmt.Println(message, err)
|
||||
}
|
||||
}
|
||||
|
||||
func fatalf(format string, a ...any) {
|
||||
fmt.Printf("fortify: "+format, a...)
|
||||
os.Exit(1)
|
||||
}
|
52
main.go
52
main.go
|
@ -1,7 +1,6 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
|
@ -48,60 +47,13 @@ func main() {
|
|||
} else if err = a.Start(); err != nil {
|
||||
logBaseError(err, "fortify: cannot start app:")
|
||||
} else if r, err = a.Wait(); err != nil {
|
||||
if r < 1 {
|
||||
r = 1
|
||||
|
||||
var e *app.BaseError
|
||||
if !app.AsBaseError(err, &e) {
|
||||
fmt.Println("fortify: wait failed:", err)
|
||||
} else {
|
||||
// Wait only returns either *app.ProcessError or *app.StateStoreError wrapped in a *app.BaseError
|
||||
var se *app.StateStoreError
|
||||
if !errors.As(err, &se) {
|
||||
// does not need special handling
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
// inner error are either unwrapped store errors
|
||||
// or joined errors returned by *appSealTx revert
|
||||
// wrapped in *app.BaseError
|
||||
var ej app.RevertCompoundError
|
||||
if !errors.As(se.InnerErr, &ej) {
|
||||
// does not require special handling
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
errs := ej.Unwrap()
|
||||
|
||||
// every error here is wrapped in *app.BaseError
|
||||
for _, ei := range errs {
|
||||
var eb *app.BaseError
|
||||
if !errors.As(ei, &eb) {
|
||||
// unreachable
|
||||
fmt.Println("fortify: invalid error type returned by revert:", ei)
|
||||
} else {
|
||||
// print inner *app.BaseError message
|
||||
fmt.Print("fortify: " + eb.Message())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
logWaitError(err)
|
||||
}
|
||||
if err := a.WaitErr(); err != nil {
|
||||
fmt.Println("fortify: inner wait failed:", err)
|
||||
}
|
||||
os.Exit(r)
|
||||
}
|
||||
|
||||
func logBaseError(err error, message string) {
|
||||
var e *app.BaseError
|
||||
|
||||
if app.AsBaseError(err, &e) {
|
||||
fmt.Print("fortify: " + e.Message())
|
||||
} else {
|
||||
fmt.Println(message, err)
|
||||
}
|
||||
}
|
||||
|
||||
func fatalf(format string, a ...any) {
|
||||
fmt.Printf("fortify: "+format, a...)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue