mox/imapserver/error.go

60 lines
1.5 KiB
Go
Raw Normal View History

2023-01-30 16:27:06 +03:00
package imapserver
import (
"errors"
2023-01-30 16:27:06 +03:00
"fmt"
)
func xcheckf(err error, format string, args ...any) {
if err != nil {
xserverErrorf("%s: %w", fmt.Sprintf(format, args...), err)
}
}
type userError struct {
code string // Optional response code in brackets.
err error
}
func (e userError) Error() string { return e.err.Error() }
func (e userError) Unwrap() error { return e.err }
func xuserErrorf(format string, args ...any) {
panic(userError{err: fmt.Errorf(format, args...)})
}
func xusercodeErrorf(code, format string, args ...any) {
panic(userError{code: code, err: fmt.Errorf(format, args...)})
}
type serverError struct{ err error }
func (e serverError) Error() string { return e.err.Error() }
func (e serverError) Unwrap() error { return e.err }
func xserverErrorf(format string, args ...any) {
panic(serverError{fmt.Errorf(format, args...)})
}
type syntaxError struct {
line string // Optional line to write before BAD result. For untagged response. CRLF will be added.
code string // Optional result code (between []) to write in BAD result.
errmsg string // BAD response message.
err error // Typically with same info as errmsg, but sometimes more.
2023-01-30 16:27:06 +03:00
}
func (e syntaxError) Error() string {
s := "bad syntax: " + e.errmsg
2023-01-30 16:27:06 +03:00
if e.code != "" {
s += " [" + e.code + "]"
}
return s
}
func (e syntaxError) Unwrap() error { return e.err }
func xsyntaxErrorf(format string, args ...any) {
errmsg := fmt.Sprintf(format, args...)
err := errors.New(errmsg)
panic(syntaxError{"", "", errmsg, err})
2023-01-30 16:27:06 +03:00
}