Documentation
¶
Index ¶
- Constants
- Variables
- func GetCategoryDescription(xyy string) string
- func GetCategoryHTTPStatus(xyy string) int
- func GetFullCode(code string) string
- func GetServicePrefix() string
- func IsValidCategory(xyy string) bool
- func NewAuthenticationError(message string, data interface{}) error
- func NewBadRequestError(message string, data interface{}) error
- func NewClientError(message string, data interface{}) error
- func NewConflictError(message string, data interface{}) error
- func NewDatabaseError(message string, data interface{}) error
- func NewForbiddenError(message string, data interface{}) error
- func NewInternalServerError(message string, data interface{}) error
- func NewNotFoundError(message string, data interface{}) error
- func NewServiceUnavailableError(message string, data interface{}) error
- func NewThirdPartyError(message string, data interface{}) error
- func NewUnauthorizedError(message string, data interface{}) error
- func NewUnprocessableEntityError(message string, data interface{}) error
- func SetServicePrefix(prefix string)
- func WrapError(original, new error) error
- func WrapErrorWithPrefix(prefix string, errptr *error)
- type AuthenticationError
- type BadRequestError
- type BaseError
- type ClientError
- type ConflictError
- type DatabaseError
- type DomainError
- type ForbiddenError
- type InternalServerError
- type NotFoundError
- type ServiceUnavailableError
- type ThirdPartyError
- type UnauthorizedError
- type UnprocessableEntityError
Constants ¶
const ( // Success (2yyzzz) StatusCodeSuccess = "200000" // General Success StatusCodePartialSuccess = "201000" // Partial Success (e.g., batch processing) StatusCodeAccepted = "202000" // Accepted (e.g., long-running task queued) // Client Errors (4yyzzz) StatusCodeGenericClientError = "400000" // General Client Error StatusCodeGenericBadRequestError = "401000" // Bad Request (e.g., missing or invalid parameters) StatusCodeGenericNotFoundError = "402000" // Not Found (e.g., resource not found) StatusCodeGenericConflictError = "403000" // Conflict (e.g., resource already exists) StatusCodeGenericUnprocessableEntityError = "404000" // Unprocessable Entity (e.g., validation error) // Server Errors (5yyzzz) StatusCodeGenericInternalServerError = "500000" // General Internal Server Error StatusCodeGenericDatabaseError = "501000" // Database Error StatusCodeGenericThirdPartyError = "502000" // Third-party Error // Authentication and Authorization Errors (9yyzzz) StatusCodeGenericAuthError = "900000" // General Authentication Error StatusCodeGenericForbiddenError = "902000" // Forbidden (e.g., insufficient permissions) )
Error code constants following the 'xyyzzz' ([x][yy][zzz]) convention. Each constant represents a specific error scenario with automatic HTTP status mapping.
Code Structure:
- 'x' (1st digit): Main category
- 'yy' (2nd-3rd digits): Subcategory within main category
- 'zzz' (4th-6th digits): Specific error identifier
Usage: These constants should be used when creating BaseError instances to ensure consistency across services and automatic HTTP status code mapping.
const DefaultServicePrefix = "ERR"
DefaultServicePrefix is the default prefix used for error codes when no custom prefix is configured. This prefix is automatically prepended to all error codes to create fully qualified error identifiers.
The default prefix "ERR" results in error codes like "ERR-400001", "ERR-500002", etc. This can be customized using SetServicePrefix() to provide service-specific prefixes like "USER-SVC-400001" or "AUTH-400001".
Variables ¶
var ErrBaseErrorCreationFailed = errors.New("BaseError creation failed")
ErrBaseErrorCreationFailed is returned when BaseError creation fails due to invalid parameters. This typically occurs when the error code doesn't follow the required format or contains invalid category codes.
Functions ¶
func GetCategoryDescription ¶
GetCategoryDescription returns a human-readable description for a given category code. This function is primarily used for logging, debugging, and error reporting purposes where a descriptive category name is more useful than the numeric code.
Parameters:
- xyy: The 3-character category code to look up (e.g., "400", "501", "902")
Returns:
- string: Human-readable description of the category, or "Unknown Category" if not found
func GetCategoryHTTPStatus ¶
GetCategoryHTTPStatus returns the appropriate HTTP status code for a given category code. This function provides the automatic HTTP status code mapping that enables consistent API responses across services without manual status code management.
If the category code is not recognized, the function returns HTTP 500 (Internal Server Error) as a safe fallback, indicating that something unexpected occurred in the error handling system.
Parameters:
- xyy: The 3-character category code to look up (e.g., "400", "501", "902")
Returns:
- int: HTTP status code corresponding to the category, or 500 if category is unknown
func GetFullCode ¶
GetFullCode constructs the complete error code by combining the configured service prefix with the base error code using a hyphen separator.
The service prefix is set globally via SetServicePrefix() and defaults to "ERR". This function is used internally by the BaseError implementation to generate the final error code returned by the Code() method.
Returns:
- string: Complete error code in format "{PREFIX}-{CODE}"
Examples:
- GetFullCode("400001") → "ERR-400001" (default prefix)
- GetFullCode("500001") → "USER-SVC-500001" (custom prefix "USER-SVC")
func GetServicePrefix ¶
func GetServicePrefix() string
GetServicePrefix returns the currently configured service prefix. This function is primarily used internally by the error formatting system but can also be used by applications that need to know the current prefix for logging or debugging purposes.
Returns:
- string: The current service prefix in uppercase format
func IsValidCategory ¶
IsValidCategory validates whether a 3-character category code ('xyy') is recognized by the system. This function is used during BaseError creation to ensure error codes follow valid conventions.
The function performs a simple map lookup to determine if the category exists in the predefined validCategories map. This validation helps catch typos and ensures consistent error categorization across the application.
Parameters:
- xyy: The 3-character category code to validate (e.g., "400", "501", "902")
Returns:
- bool: true if the category is valid and recognized, false otherwise
func NewAuthenticationError ¶
NewAuthenticationError creates a new AuthenticationError instance using the generic authentication error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewBadRequestError ¶
NewBadRequestError creates a new BadRequestError instance using the generic bad request error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewClientError ¶
NewClientError creates a new ClientError instance using the generic client error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewConflictError ¶
NewConflictError creates a new ConflictError instance using the generic conflict error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewDatabaseError ¶
NewDatabaseError creates a new DatabaseError instance using the generic database error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewForbiddenError ¶
NewForbiddenError creates a new ForbiddenError instance using the generic forbidden error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewInternalServerError ¶
NewInternalServerError creates a new InternalServerError instance using the generic internal error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewNotFoundError ¶
NewNotFoundError creates a new NotFoundError instance using the generic not found error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewServiceUnavailableError ¶ added in v0.11.2
NewServiceUnavailableError creates a new ServiceUnavailableError instance using the generic service unavailable error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewThirdPartyError ¶
NewThirdPartyError creates a new ThirdPartyError instance using the generic third-party error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewUnauthorizedError ¶
NewUnauthorizedError creates a new UnauthorizedError instance using the generic unauthorized error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func NewUnprocessableEntityError ¶
NewUnprocessableEntityError creates a new UnprocessableEntityError instance using the generic unprocessable entity error code. If the `message` parameter is an empty string (""), the default message for the error code will be used.
func SetServicePrefix ¶
func SetServicePrefix(prefix string)
SetServicePrefix configures a custom service-specific prefix for all error codes. The prefix is automatically converted to uppercase to ensure consistency across the application. If an empty string is provided, the system reverts to the default prefix.
This function is typically called once during application initialization to establish service-specific error code formatting. The prefix helps identify which service generated an error in distributed systems or microservice architectures.
Prefix Format:
- Should be descriptive of the service (e.g., "USER-SVC", "AUTH", "PAYMENT")
- Automatically converted to uppercase for consistency
- Should not include the trailing dash separator (automatically added)
- Empty strings revert to DefaultServicePrefix
func WrapError ¶
WrapError combines two errors into a single error with proper error chaining. This function handles various nil combinations gracefully and uses Go's error wrapping semantics to preserve the error chain for unwrapping operations.
Error Combination Logic:
- If both errors are nil: returns nil
- If only one error is nil: returns the non-nil error
- If both errors are non-nil: wraps new around original using fmt.Errorf with %w verb
The wrapping order places 'new' as the outer error and 'original' as the inner error, allowing proper unwrapping via errors.Unwrap(), errors.Is(), and errors.As().
func WrapErrorWithPrefix ¶
WrapErrorWithPrefix wraps an error pointed to by errptr with a descriptive prefix. This is a convenience function for adding context to errors using a pointer pattern, which is useful in functions that modify error values in-place.
Example:
func ProcessFile(filename string) (err error) { defer func() { // Add context to any error that occurred errors.WrapErrorWithPrefix("failed to process file "+filename, &err) }() // ... rest of processing return nil }
Types ¶
type AuthenticationError ¶
type AuthenticationError struct {
*BaseError
}
func (*AuthenticationError) As ¶ added in v0.18.0
func (e *AuthenticationError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**AuthenticationError) and value (*AuthenticationError) targets for compatibility with Go's errors.As function.
type BadRequestError ¶
type BadRequestError struct {
*BaseError
}
func (*BadRequestError) As ¶ added in v0.18.0
func (e *BadRequestError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**BadRequestError) and value (*BadRequestError) targets for compatibility with Go's errors.As function.
type BaseError ¶
type BaseError struct {
// contains filtered or unexported fields
}
BaseError provides a default implementation of the DomainError interface. It serves as the foundational error type that can be embedded in other error types to provide consistent error handling behavior across the application.
BaseError implements the following interfaces:
- error (standard Go error interface)
- DomainError (custom domain error interface)
The error code follows a structured format 'xyyzzz' where:
- 'x' (1st digit): Main error category
- 'yy' (2nd-3rd digits): Subcategory within the main category
- 'zzz' (4th-6th digits): Specific error detail identifier
func ExtractBaseError ¶
ExtractBaseError attempts to extract a BaseError from any error type that embeds it. This function uses reflection to search for an embedded *BaseError field in the error's struct definition, supporting both pointer and non-pointer error types.
The function performs the following checks:
- Direct type assertion for *BaseError
- Reflection-based search for embedded *BaseError fields (one layer deep)
- Support for both pointer and value receivers
Parameters:
- err: The error to extract BaseError from (can be nil)
Returns:
- *BaseError: The extracted BaseError if found, nil otherwise
func NewBaseError ¶
NewBaseError creates a new BaseError instance with validation and automatic defaults. If the message parameter is empty, it uses the default message from the error code configuration. The HTTP status code is automatically determined based on the error category.
Error Code Format: The error code must follow the 'xyyzzz' convention (exactly 6 characters):
- 'x' (1st digit): Main error category (must be valid as defined in validCategories)
- 'yy' (2nd-3rd digits): Subcategory within the main category
- 'zzz' (4th-6th digits): Specific error detail identifier
Parameters:
- code: The 6-character error code following the 'xyyzzz' format
- message: Human-readable error message (empty string uses default message)
- data: Optional additional data to associate with the error
Returns:
- *BaseError: The created BaseError instance
- error: ErrBaseErrorCreationFailed if validation fails
Validation Rules:
- Code must be exactly 6 characters long
- First 3 characters ('xyy') must match a valid category
- Category must be defined in the system's category configuration
func (*BaseError) Code ¶
Code returns the full error code with any configured prefix. This method calls GetFullCode() to ensure consistent code formatting across the application.
Returns:
- string: The complete error code with prefix (e.g., "APP-400001")
Example:
err := NewBaseError("400001", "Invalid input", nil) code := err.Code() // Returns "APP-400001" (assuming "APP-" prefix)
func (*BaseError) Error ¶
Error implements the standard Go error interface. It returns the error message, making BaseError compatible with all Go error handling patterns.
Returns:
- string: The error message (same as GetMessage())
Example:
err := NewBaseError("500001", "Database connection failed", nil) fmt.Println(err.Error()) // Prints: "Database connection failed"
func (*BaseError) GetData ¶
func (e *BaseError) GetData() interface{}
GetData returns any additional data associated with this error. This can be used to provide context-specific information such as validation details, request parameters, or debugging information.
Returns:
- interface{}: The additional data, or nil if no data was provided
Example:
validationData := map[string]string{"field": "email", "reason": "invalid format"} err := NewBaseError("400001", "Validation failed", validationData) data := err.GetData() // Returns the validation data map
func (*BaseError) GetHTTPCode ¶
GetHTTPCode returns the HTTP status code associated with this error. The HTTP code is automatically determined based on the error category during BaseError creation.
func (*BaseError) GetMessage ¶
GetMessage returns the human-readable error message. If no custom message was provided during creation, this returns the default message associated with the error code.
Returns:
- string: The error message for display to users or logging
Example:
err := NewBaseError("400001", "Custom message", nil) message := err.GetMessage() // Returns "Custom message"
type ClientError ¶
type ClientError struct {
*BaseError
}
func (*ClientError) As ¶ added in v0.18.0
func (e *ClientError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**ClientError) and value (*ClientError) targets for compatibility with Go's errors.As function.
type ConflictError ¶
type ConflictError struct {
*BaseError
}
func (*ConflictError) As ¶ added in v0.18.0
func (e *ConflictError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**ConflictError) and value (*ConflictError) targets for compatibility with Go's errors.As function.
type DatabaseError ¶
type DatabaseError struct {
*BaseError
}
func (*DatabaseError) As ¶ added in v0.18.0
func (e *DatabaseError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**DatabaseError) and value (*DatabaseError) targets for compatibility with Go's errors.As function.
type DomainError ¶
type DomainError interface { // GetHTTPCode returns the HTTP status code associated with the error. // The status code is automatically determined based on the error category // and follows standard HTTP status code conventions. GetHTTPCode() int // Code returns the full error code including the configured service prefix. // The format is typically "{PREFIX}-{ERRORCODE}" where PREFIX is set via // SetServicePrefix() and ERRORCODE follows the 'xyyzzz' convention. Code() string // GetMessage returns a human-readable error message suitable for logging // or displaying to users. If no custom message was provided during error // creation, this returns the default message associated with the error code. GetMessage() string // GetData returns any additional structured data associated with the error. // This can include validation details, request context, debugging information, // or any other relevant metadata that might be useful for error handling, // logging, or client responses. GetData() interface{} // Error implements the standard Go error interface, making DomainError // compatible with all Go error handling patterns and libraries. Error() string }
DomainError is the interface that all custom errors in the framework implement. It provides a standardized contract for retrieving error information including structured error codes, human-readable messages, HTTP status codes, and additional context data.
Error Code Convention: The error code follows the format 'xyyzzz' where:
- 'x' (1st digit): Main error category
- 'yy' (2nd-3rd digits): Subcategory within the main category
- 'zzz' (4th-6th digits): Specific error identifier within the subcategory
Implementation Requirements: All implementations should embed *BaseError to ensure consistent behavior and enable automatic error extraction via ExtractBaseError().
func UnwrapDomainError ¶
func UnwrapDomainError(err error) DomainError
UnwrapDomainError traverses an error chain to find the first error that implements the DomainError interface and contains an embedded BaseError. This function is essential for extracting domain-specific error information from wrapped error chains.
Search Algorithm:
- Start with the provided error
- Check if error implements DomainError interface
- Verify that the error contains an embedded BaseError (via ExtractBaseError)
- If both conditions are met, return the domain error
- Otherwise, unwrap to the next error in the chain
- Repeat until chain is exhausted
type ForbiddenError ¶
type ForbiddenError struct {
*BaseError
}
func (*ForbiddenError) As ¶ added in v0.18.0
func (e *ForbiddenError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**ForbiddenError) and value (*ForbiddenError) targets for compatibility with Go's errors.As function.
type InternalServerError ¶
type InternalServerError struct {
*BaseError
}
func (*InternalServerError) As ¶ added in v0.18.0
func (e *InternalServerError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**InternalServerError) and value (*InternalServerError) targets for compatibility with Go's errors.As function.
type NotFoundError ¶
type NotFoundError struct {
*BaseError
}
func (*NotFoundError) As ¶ added in v0.18.0
func (e *NotFoundError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**NotFoundError) and value (*NotFoundError) targets for compatibility with Go's errors.As function.
type ServiceUnavailableError ¶ added in v0.11.2
type ServiceUnavailableError struct {
}func (*ServiceUnavailableError) As ¶ added in v0.18.0
func (e *ServiceUnavailableError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**ServiceUnavailableError) and value (*ServiceUnavailableError) targets for compatibility with Go's errors.As function.
type ThirdPartyError ¶
type ThirdPartyError struct {
*BaseError
}
func (*ThirdPartyError) As ¶ added in v0.18.0
func (e *ThirdPartyError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**ThirdPartyError) and value (*ThirdPartyError) targets for compatibility with Go's errors.As function.
type UnauthorizedError ¶
type UnauthorizedError struct {
}func (*UnauthorizedError) As ¶ added in v0.18.0
func (e *UnauthorizedError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**UnauthorizedError) and value (*UnauthorizedError) targets for compatibility with Go's errors.As function.
type UnprocessableEntityError ¶
type UnprocessableEntityError struct {
*BaseError
}
func (*UnprocessableEntityError) As ¶ added in v0.18.0
func (e *UnprocessableEntityError) As(target interface{}) bool
As checks if the error can be assigned to the target interface. Supports both pointer (**UnprocessableEntityError) and value (*UnprocessableEntityError) targets for compatibility with Go's errors.As function.