///|
/// Error values returned by EventRail builders and validators.
pub(all) enum EventRailError {
  EmptyTopic
  EmptyPattern
  EmptySegment(String)
  InvalidPattern(String)
  InvalidSubscription(String)
  DuplicateSubscription(String)
  MissingField(String)
  HandlerFailure(String)
  RetryLimitReached(String)
} derive(Eq, @debug.Debug)

///|
pub fn EventRailError::message(self : EventRailError) -> String {
  match self {
    EmptyTopic => "event topic must not be empty"
    EmptyPattern => "topic pattern must not be empty"
    EmptySegment(topic) => "topic contains an empty segment: \{topic}"
    InvalidPattern(pattern) => "invalid topic pattern: \{pattern}"
    InvalidSubscription(id) => "invalid subscription: \{id}"
    DuplicateSubscription(id) => "duplicate subscription id: \{id}"
    MissingField(path) => "payload field is missing: \{path}"
    HandlerFailure(reason) => "handler failed: \{reason}"
    RetryLimitReached(id) => "retry limit reached for event: \{id}"
  }
}

///|
pub fn EventRailError::is_configuration_error(self : EventRailError) -> Bool {
  match self {
    EmptyTopic
    | EmptyPattern
    | EmptySegment(_)
    | InvalidPattern(_)
    | InvalidSubscription(_)
    | DuplicateSubscription(_) => true
    MissingField(_) | HandlerFailure(_) | RetryLimitReached(_) => false
  }
}