package membership import ( "errors" "fmt" ) // ErrNotFound reports that a membership record was requested but does not // exist in the store. var ErrNotFound = errors.New("membership not found") // ErrConflict reports that a membership mutation could not be applied // because the record changed concurrently or failed a compare-and-swap // guard. var ErrConflict = errors.New("membership conflict") // ErrInvalidTransition is the sentinel returned when Transition rejects a // `(from, to)` pair. var ErrInvalidTransition = errors.New("invalid membership status transition") // InvalidTransitionError stores the rejected `(from, to)` pair and wraps // ErrInvalidTransition so callers can match it with errors.Is. type InvalidTransitionError struct { // From stores the source status that was attempted to leave. From Status // To stores the destination status that was attempted to enter. To Status } // Error reports a human-readable summary of the rejected pair. func (err *InvalidTransitionError) Error() string { return fmt.Sprintf( "invalid membership status transition from %q to %q", err.From, err.To, ) } // Unwrap returns ErrInvalidTransition so errors.Is recognizes the sentinel. func (err *InvalidTransitionError) Unwrap() error { return ErrInvalidTransition }