Track the operation owning internal errors
This commit is contained in:
38
internal/usecase/operation_error.go
Normal file
38
internal/usecase/operation_error.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package usecase
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"go.maximumdirect.net/promptkit/internal/profile"
|
||||
"go.maximumdirect.net/promptkit/internal/promptdef"
|
||||
)
|
||||
|
||||
// OperationError identifies the operation that owns a failure while retaining
|
||||
// the original cause for inspection.
|
||||
type OperationError struct {
|
||||
Category error
|
||||
Cause error
|
||||
}
|
||||
|
||||
func (e *OperationError) Error() string { return fmt.Sprintf("%v: %v", e.Category, e.Cause) }
|
||||
func (e *OperationError) Unwrap() error { return e.Cause }
|
||||
func (e *OperationError) Is(target error) bool { return target == e.Category }
|
||||
|
||||
func promptLookupError(cause error) error {
|
||||
category := ErrPromptLoad
|
||||
if errors.Is(cause, promptdef.ErrPromptDefinitionNotFound) {
|
||||
category = promptdef.ErrPromptDefinitionNotFound
|
||||
cause = fmt.Errorf("%w: %w", ErrPromptLoad, cause)
|
||||
}
|
||||
return &OperationError{Category: category, Cause: cause}
|
||||
}
|
||||
|
||||
func profileLookupError(cause error) error {
|
||||
category := ErrProfileLoad
|
||||
if errors.Is(cause, profile.ErrProfileNotFound) {
|
||||
category = profile.ErrProfileNotFound
|
||||
cause = fmt.Errorf("%w: %w", ErrProfileLoad, cause)
|
||||
}
|
||||
return &OperationError{Category: category, Cause: cause}
|
||||
}
|
||||
Reference in New Issue
Block a user