///|
pub enum DeadlineConstraint {
  Within(Date, Date)
  MustBeBusinessDay
  NotCrossingYear
} derive(Debug, Eq, Compare)

///|
pub enum ConstraintError {
  ConstraintInvalidRange
  ConstraintViolation(String)
  ConstraintDeadlineFailure(DeadlineError)
} derive(Debug)

///|
pub struct ConstrainedDeadline {
  start_date : Date
  rule : DateRule
  start_rule : StartDateRule
  calendar : Calendar
  extension : ExtensionPolicy
  constraints : Array[DeadlineConstraint]
}