quando/errors.go

79 lines
2.8 KiB
Go
Raw Permalink Normal View History

package quando
import "errors"
// Error Handling Policy
//
// The quando library follows a strict no-panic policy for all normal operations.
// Errors are always returned as values, allowing calling code to handle them
// appropriately.
//
// Exception: Must* functions (e.g., MustParse) are provided for convenience
// in tests and initialization code. These functions panic on error and should
// never be used in production code where errors need to be handled gracefully.
//
// Error Types
//
// The library defines sentinel errors for common error conditions. Use errors.Is()
// to check for specific error types:
//
// date, err := quando.Parse("invalid")
// if errors.Is(err, quando.ErrInvalidFormat) {
// // Handle invalid format
// }
//
// For errors with context, use fmt.Errorf with %w to wrap errors:
//
// return Date{}, fmt.Errorf("parsing date %q: %w", input, quando.ErrInvalidFormat)
// ErrInvalidFormat indicates that a date string could not be parsed.
//
// This error is returned when:
// - The input string doesn't match any supported format
// - The format is ambiguous (e.g., "01/02/2026" without year prefix)
// - The date components are invalid (e.g., "2026-13-01" for month 13)
//
// Example:
//
// date, err := quando.Parse("not-a-date")
// if errors.Is(err, quando.ErrInvalidFormat) {
// log.Printf("Invalid date format: %v", err)
// }
var ErrInvalidFormat = errors.New("invalid date format")
// ErrInvalidTimezone indicates that a timezone name is not recognized.
//
// This error is returned when:
// - The IANA timezone name is not found in the system timezone database
// - The timezone string is malformed
//
// Valid timezone names include "UTC", "America/New_York", "Europe/Berlin", etc.
// See the IANA Time Zone Database for a complete list.
//
// Example:
//
// date, err := quando.Now().InTimezone("Invalid/Timezone")
// if errors.Is(err, quando.ErrInvalidTimezone) {
// log.Printf("Unknown timezone: %v", err)
// }
var ErrInvalidTimezone = errors.New("invalid timezone")
// ErrOverflow indicates that a date arithmetic operation would result in
// a date outside the representable range.
//
// This error is returned when:
// - Adding/subtracting would exceed Go's time.Time range (approximately year 0 to 9999)
// - The resulting date would be before the minimum or after the maximum representable time
//
// Example:
//
// date := quando.From(time.Date(9999, 12, 31, 0, 0, 0, 0, time.UTC))
// result, err := date.Add(1, quando.Years)
// if errors.Is(err, quando.ErrOverflow) {
// log.Printf("Date overflow: %v", err)
// }
//
// Note: In the current implementation, arithmetic operations that would overflow
// are handled by Go's time.Time, which has its own overflow behavior. This error
// is reserved for future use when explicit overflow detection is added.
var ErrOverflow = errors.New("date overflow")