///|
/// A named date that can be used as the start of a deadline workflow.
pub enum EventSpec {
  Fixed(Date)
  After(String, Int)
} derive(Debug, Eq, Compare)

///|
/// Errors produced while resolving named events.
pub enum EventError {
  EventDuplicate(String)
  EventMissing(String)
  EventCycle(String)
  EventNegativeOffset(String)
  EventDateFailure(DateError)
} derive(Debug, Eq, Compare)

///|
struct EventEntry {
  name : String
  spec : EventSpec
}

///|
/// An immutable collection of named event definitions.
pub struct EventContext {
  entries : Array[EventEntry]
}

///|
/// A deadline whose start date is resolved from an event context.
pub struct EventDeadline {
  event : String
  rule : DateRule
  start_rule : StartDateRule
  calendar : Calendar
  extension : ExtensionPolicy
}

///|
pub enum EventDeadlineError {
  Event(EventError)
  Deadline(DeadlineError)
} derive(Debug)