diff --git a/errorf.go b/errorf.go index 03bde47..9be66cc 100644 --- a/errorf.go +++ b/errorf.go @@ -14,7 +14,7 @@ import ( // // If you want a different user message, use Msg, such as: // -// err := errors.Errorf(http.StatusNotFound, "%w", sqlError).Msg("user not found %d", userId) +// err := errors.Errorf(http.StatusNotFound, "%w", sqlError).SetMsg("user not found %d", userId) func Errorf(status int, format string, parts ...any) SettableError { if len(parts) == 0 { return &erf{status, format, ""} @@ -41,7 +41,7 @@ type erf struct { msg string } -func (e *erf) GetStatus() int { +func (e *erf) Status() int { if e.stat < http.StatusContinue || e.stat >= 600 { e.stat = http.StatusInternalServerError } @@ -52,15 +52,15 @@ func (e *erf) Error() string { return e.err } -func (e *erf) GetMsg() string { +func (e *erf) Msg() string { if e.msg == "" { return e.err } return e.msg } -func (e *erf) Status(status int) SettableError { - // GetStatus already handles invalid values, so we'll just ignore this. +func (e *erf) SetStatus(status int) SettableError { + // Status already handles invalid values, so we'll just ignore this. if status < http.StatusContinue || status >= 600 { return e } @@ -68,7 +68,7 @@ func (e *erf) Status(status int) SettableError { return e } -func (e *erf) Msg(msg string, parts ...any) SettableError { +func (e *erf) SetMsg(msg string, parts ...any) SettableError { e.msg = msg if len(parts) > 0 { e.msg = fmt.Sprintf(msg, parts...) diff --git a/errorf_test.go b/errorf_test.go index 1a83ca0..5abc136 100644 --- a/errorf_test.go +++ b/errorf_test.go @@ -28,8 +28,8 @@ func (s *ErrorfTestSuite) TestNoWrap() { exp := "42 is more than 13" s.Assert().Equal(exp, err.Error()) - s.Assert().Equal(exp, err.GetMsg()) - s.Assert().Equal(http.StatusTeapot, err.GetStatus()) + s.Assert().Equal(exp, err.Msg()) + s.Assert().Equal(http.StatusTeapot, err.Status()) } func (s *ErrorfTestSuite) TestWrapOne() { @@ -45,7 +45,7 @@ func (s *ErrorfTestSuite) TestWrapOne() { exp := "I'm a little teapot. Here is my handle." s.Assert().Equal(exp, we.Error()) - s.Assert().Equal(exp, we.GetMsg()) + s.Assert().Equal(exp, we.Msg()) s.Assert().Same(wrapped, we.Unwrap()) } @@ -63,7 +63,7 @@ func (s *ErrorfTestSuite) TestWrapTwo() { exp := "I'm a little teapot: short and stout. Here is my handle." s.Assert().Equal(exp, we.Error()) - s.Assert().Equal(exp, we.GetMsg()) + s.Assert().Equal(exp, we.Msg()) unwrapped := we.Unwrap() s.Assert().Len(unwrapped, 2) s.Assert().Same(wrappedOne, unwrapped[0]) @@ -74,31 +74,31 @@ func (s *ErrorfTestSuite) TestSet() { var err SettableError = Errorf(http.StatusTeapot, "Unable to BREW") s.Assert().NotNil(err) - err.Status(http.StatusTooEarly).Msg("It's only %dAM", 2) - s.Assert().Equal(http.StatusTooEarly, err.GetStatus()) - s.Assert().Equal("It's only 2AM", err.GetMsg()) + err.SetStatus(http.StatusTooEarly).SetMsg("It's only %dAM", 2) + s.Assert().Equal(http.StatusTooEarly, err.Status()) + s.Assert().Equal("It's only 2AM", err.Msg()) s.Assert().Equal("Unable to BREW", err.Error()) - err.Msg("I am so great") - s.Assert().Equal("I am so great", err.GetMsg()) + err.SetMsg("I am so great") + s.Assert().Equal("I am so great", err.Msg()) } func (s *ErrorfTestSuite) TestGetStatusOutsideRange() { var err ResponsableError = Errorf(5, "Hello") s.Assert().NotNil(err) - s.Assert().Equal(http.StatusInternalServerError, err.GetStatus()) + s.Assert().Equal(http.StatusInternalServerError, err.Status()) err = Errorf(5, "Hello") s.Assert().NotNil(err) - s.Assert().Equal(http.StatusInternalServerError, err.GetStatus()) + s.Assert().Equal(http.StatusInternalServerError, err.Status()) } func (s *ErrorfTestSuite) TestSetStatusOutsideRange() { var err SettableError = Errorf(http.StatusPaymentRequired, "Hello") s.Assert().NotNil(err) - err.Status(10) - s.Assert().Equal(http.StatusPaymentRequired, err.GetStatus()) - err.Status(600) - s.Assert().Equal(http.StatusPaymentRequired, err.GetStatus()) + err.SetStatus(10) + s.Assert().Equal(http.StatusPaymentRequired, err.Status()) + err.SetStatus(600) + s.Assert().Equal(http.StatusPaymentRequired, err.Status()) } diff --git a/interface.go b/interface.go index da03a48..38c0ec2 100644 --- a/interface.go +++ b/interface.go @@ -3,25 +3,29 @@ package errors // ResponsableError is an error that has information useful in an HTTP response. // The string returned by Error should be suitable for logging useful information // to assist debugging the error. -// GetStatus should return an appropriate HTTP status. -// GetMsg should return a message suitable to display to the end user. If the message +// +// Status should return an appropriate HTTP status. It must not return < 100 || >= 600. +// +// Msg should return a message suitable to display to the end user. If the message // returned by Error is safe for the end user, it may simply call that. -// GetStatus should not return a value outside of the 100 - 599 range. type ResponsableError interface { Error() string - GetStatus() int - GetMsg() string + Status() int + Msg() string } // SettableError is a ResponsableError which can be modified after initial creation. -// The Status method can set the status, while the Msg method can set user message. +// +// The SetStatus method can set the status, while the SetMsg method can set user message. // If any values are passed after the message, it should be passed to fmt.Sprintf for formatting. +// // Methods are chainable. +// // SetStatus should not use a value outside of 100-599. It may either ignore such values, or panic. type SettableError interface { ResponsableError - Status(int) SettableError - Msg(string, ...any) SettableError + SetStatus(int) SettableError + SetMsg(string, ...any) SettableError } // UnwrappableError allows a ResponsableError to wrap another error. diff --git a/new.go b/new.go index 73e1cf6..0adc51d 100644 --- a/new.go +++ b/new.go @@ -24,5 +24,5 @@ func NewBadRequest(format string, parts ...any) SettableError { func NewInternalError(format string, parts ...any) SettableError { status := http.StatusInternalServerError msg := "Unknown Error" - return Errorf(status, format, parts...).Msg(msg) + return Errorf(status, format, parts...).SetMsg(msg) } diff --git a/new_test.go b/new_test.go index fc74651..12cae4d 100644 --- a/new_test.go +++ b/new_test.go @@ -19,8 +19,8 @@ func (s *NewTestSuite) TestNotFound() { msg := "I can't see you" var err ResponsableError = NewNotFound(msg) s.Assert().NotNil(err) - s.Assert().Equal(http.StatusNotFound, err.GetStatus()) - s.Assert().Equal(msg, err.GetMsg()) + s.Assert().Equal(http.StatusNotFound, err.Status()) + s.Assert().Equal(msg, err.Msg()) s.Assert().Equal(msg, err.Error()) } @@ -28,7 +28,7 @@ func (s *NewTestSuite) TestNotFoundDefaultMsg() { msg := "Not Found" var err ResponsableError = NewNotFound("") s.Assert().NotNil(err) - s.Assert().Equal(msg, err.GetMsg()) + s.Assert().Equal(msg, err.Msg()) s.Assert().Equal(msg, err.Error()) } @@ -36,8 +36,8 @@ func (s *NewTestSuite) TestBadRequest() { msg := "I can't see you" var err ResponsableError = NewBadRequest(msg) s.Assert().NotNil(err) - s.Assert().Equal(http.StatusBadRequest, err.GetStatus()) - s.Assert().Equal(msg, err.GetMsg()) + s.Assert().Equal(http.StatusBadRequest, err.Status()) + s.Assert().Equal(msg, err.Msg()) s.Assert().Equal(msg, err.Error()) } @@ -45,7 +45,7 @@ func (s *NewTestSuite) TestBadRequestDefaultMsg() { msg := "Bad Request" var err ResponsableError = NewBadRequest("") s.Assert().NotNil(err) - s.Assert().Equal(msg, err.GetMsg()) + s.Assert().Equal(msg, err.Msg()) s.Assert().Equal(msg, err.Error()) } @@ -53,5 +53,5 @@ func (s *NewTestSuite) TestInternal() { var err ResponsableError = NewInternalError("%d > %d", 42, 13) s.Assert().NotNil(err) s.Assert().Equal("42 > 13", err.Error()) - s.Assert().Equal("Unknown Error", err.GetMsg()) + s.Assert().Equal("Unknown Error", err.Msg()) }