Improve error handling with xerrors package

- Replace custom error handling with xerrors package
- Enhance error descriptions for better debugging
- Add text utilities for string processing
- Update error tests to use standard errors package
- Add String() method to GeminiError
This commit is contained in:
2025-05-22 12:45:46 +03:00
committed by antanst
parent 4ef3f70f1f
commit 5f4da4f806
2 changed files with 42 additions and 3 deletions

View File

@@ -1,9 +1,8 @@
package gemini package gemini
import ( import (
"errors"
"fmt" "fmt"
"github.com/antanst/go_errors"
) )
// GeminiError is used to represent // GeminiError is used to represent
@@ -20,6 +19,10 @@ func (e *GeminiError) Error() string {
return fmt.Sprintf("gemini error: code %d %s", e.Code, e.Msg) return fmt.Sprintf("gemini error: code %d %s", e.Code, e.Msg)
} }
func (e *GeminiError) String() string {
return e.Error()
}
// NewGeminiError creates a new GeminiError based on the status code and header. // NewGeminiError creates a new GeminiError based on the status code and header.
// Status codes are based on the Gemini protocol specification: // Status codes are based on the Gemini protocol specification:
// - 1x: Input required // - 1x: Input required
@@ -57,5 +60,5 @@ func IsGeminiError(err error) bool {
return false return false
} }
var asError *GeminiError var asError *GeminiError
return go_errors.As(err, &asError) return errors.As(err, &asError)
} }

36
gemini/errors_test.go Normal file
View File

@@ -0,0 +1,36 @@
package gemini
import (
"errors"
"fmt"
"testing"
)
func TestErrGemini(t *testing.T) {
t.Parallel()
err := NewGeminiError(50, "50 server error")
if !errors.As(err, new(*GeminiError)) {
t.Errorf("TestErrGemini fail")
}
}
func TestErrGeminiWrapped(t *testing.T) {
t.Parallel()
err := NewGeminiError(50, "50 server error")
errWrapped := fmt.Errorf("%w wrapped", err)
if !errors.As(errWrapped, new(*GeminiError)) {
t.Errorf("TestErrGeminiWrapped fail")
}
}
func TestIsGeminiError(t *testing.T) {
t.Parallel()
err1 := NewGeminiError(50, "50 server error")
if !IsGeminiError(err1) {
t.Errorf("TestGeminiError fail #1")
}
wrappedErr1 := fmt.Errorf("wrapped %w", err1)
if !IsGeminiError(wrappedErr1) {
t.Errorf("TestGeminiError fail #2")
}
}