Deterministic legal and contract deadline calculations with injectable business calendars.
moon run cmd/deadline -- --start 2026-08-07 --rule business-days:5 --exclude-start --extension following --explaincalendar=standard
version=builtin
region=
source=
source_url=
start=2026-08-07
original=2026-08-14
adjusted=2026-08-14
adjustments=0
crossed_month=false
crossed_year=falsemoon run cmd/deadline -- --start 2026-08-07 --rule business-days:5 --exclude-start --format tablelet calendar = @deadline.Calendar::china_2026()
let deadline = @deadline.Deadline::new(
start_date=@deadline.Date::parse("2026-04-30").unwrap(),
rule=@deadline.DateRule::business_days(1),
start_rule=@deadline.StartDateRule::exclude(),
calendar~,
extension=@deadline.ExtensionPolicy::following(),
)
let result = deadline.calculate().unwrap()
println(result.summary())
println(@deadline.AuditReport::from_result(result, calendar).to_text())moon run bench/deadline_bench -- --iterations 10case=calendar iterations=100 checksum=48818044
case=deadline iterations=100 checksum=73967272
case=batch iterations=100 checksum=73983800moon check --target all --deny-warn
moon test --target wasm-gc --deny-warn
moon run cmd/deadline -- --start 2026-08-07 --rule business-days:5 --exclude-start --extension following --explain
moon run bench/deadline_bench -- --iterations 100
moon fmt
moon info
git diff --exit-codefn BatchDeadline::calculate(self : BatchDeadline, context : EventContext) -> Result[BatchResult, BatchError]pub enum BatchError {
BatchDuplicate(String)
BatchMissingDependency(String)
BatchCycle(String)
BatchEmpty
BatchEventFailure(EventError)
BatchDeadlineFailure(DeadlineError)
} derive(Debug)pub struct BatchTask {
name : String
event : String?
dependency : String?
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
}fn BatchTask::after(name~ : String, dependency~ : String, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> BatchTaskfn BatchTask::from_event(name~ : String, event~ : String, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> BatchTaskfn BusinessDayCursor::forward(self : BusinessDayCursor, count : Int) -> Result[Array[Date], CursorError]fn BusinessDaySeries::new(calendar~ : Calendar, start~ : Date, end~ : Date) -> Result[BusinessDaySeries, SeriesError]fn Calendar::advance_business_days(self : Calendar, start : Date, count : Int, include_start? : Bool) -> Result[Date, CalendarError]fn Calendar::dates_between(self : Calendar, start~ : Date, end~ : Date, filter~ : CalendarDateFilter) -> Result[Array[Date], CalendarValidationError]fn Calendar::merge(primary : Calendar, secondary : Calendar) -> Result[Calendar, CalendarValidationError]fn Calendar::summarize(self : Calendar, start~ : Date, end~ : Date) -> Result[CalendarSummary, CalendarValidationError]pub struct CalendarBuilder {
name : String
version : String
region : String
source : CalendarSource
valid_from : Date?
valid_to : Date?
weekend : WeekendPolicy
holidays : Array[Date]
extra_workdays : Array[Date]
}fn CalendarBuilder::new(name~ : String, version~ : String, weekend~ : WeekendPolicy) -> CalendarBuilderfn CalendarBuilder::valid_during(self : CalendarBuilder, start~ : Date, end~ : Date) -> CalendarBuilderfn CalendarCatalog::add(self : CalendarCatalog, calendar : Calendar) -> Result[CalendarCatalog, CatalogError]pub struct CalendarDayInfo {
date : Date
kind : CalendarDayKind
calendar_name : String
calendar_version : String
}fn CalendarTimeline::between(calendar~ : Calendar, start~ : Date, end~ : Date) -> Result[CalendarTimeline, TimelineError]fn CalendarVersion::new(name~ : String, region~ : String, version~ : String, source~ : CalendarSource, valid_from~ : Date, valid_to~ : Date) -> Result[CalendarVersion, CalendarVersionError]pub enum CatalogError {
CatalogDuplicate(String)
CatalogInvalid(CalendarValidationError)
} derive(Debug)pub struct ConstrainedDeadline {
start_date : Date
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
constraints : Array[DeadlineConstraint]
}fn ConstrainedDeadline::add_constraint(self : ConstrainedDeadline, constraint : DeadlineConstraint) -> Result[ConstrainedDeadline, ConstraintError]fn ConstrainedDeadline::calculate(self : ConstrainedDeadline) -> Result[DeadlineResult, ConstraintError]fn ConstrainedDeadline::new(start_date~ : Date, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> ConstrainedDeadlinepub enum ConstraintError {
ConstraintInvalidRange
ConstraintViolation(String)
ConstraintDeadlineFailure(DeadlineError)
} derive(Debug)fn DateRange::intersection(self : DateRange, other : DateRange) -> Result[DateRange, DateRangeError]pub struct Deadline {
start_date : Date
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
} derive(Debug)fn Deadline::new(start_date~ : Date, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> Deadlinefn DeadlineConstraint::within(start~ : Date, end~ : Date) -> Result[DeadlineConstraint, ConstraintError]pub enum DeadlineError {
NegativeRuleCount
CalendarFailure(CalendarError)
DateFailure(DateError)
} derive(Debug)pub struct DeadlineForecast {
start : Date
unit : ForecastUnit
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
}fn DeadlineForecast::calculate(self : DeadlineForecast, counts : Array[Int]) -> Result[ForecastResult, ForecastError]fn DeadlineForecast::new(start~ : Date, unit~ : ForecastUnit, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> DeadlineForecastfn DeadlineLedger::add(self : DeadlineLedger, record : DeadlineRecord) -> Result[DeadlineLedger, LedgerError]pub struct DeadlineMatrix {
start : Date
rule : DateRule
start_rule : StartDateRule
extension : ExtensionPolicy
scenarios : Array[MatrixScenario]
}fn DeadlineMatrix::add_calendar(self : DeadlineMatrix, name : String, calendar : Calendar) -> Result[DeadlineMatrix, MatrixError]fn DeadlineMatrix::new(start~ : Date, rule~ : DateRule, start_rule~ : StartDateRule, extension~ : ExtensionPolicy) -> DeadlineMatrixfn DeadlinePlan::add_stage(self : DeadlinePlan, label~ : String, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy, start_source? : StageStartSource, suspension? : SuspensionSet) -> Result[DeadlinePlan, PlanError]fn DeadlineRecord::complete(self : DeadlineRecord, completed_on : Date) -> Result[DeadlineRecord, CompletionError]pub struct DeadlineRequest {
id : String
start : Date
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
}fn DeadlineRequest::new(id~ : String, start~ : Date, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> DeadlineRequestpub enum DeadlineService {
}fn DeadlineWindow::intersection(self : DeadlineWindow, other : DeadlineWindow) -> Result[DeadlineWindow, WindowError]fn DeadlineWindow::shift(self : DeadlineWindow, offset : Int) -> Result[DeadlineWindow, WindowError]fn EventContext::insert(self : EventContext, name : String, spec : EventSpec) -> Result[EventContext, EventError]pub struct EventDeadline {
event : String
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
}fn EventDeadline::calculate(self : EventDeadline, context : EventContext) -> Result[DeadlineResult, EventDeadlineError]fn EventDeadline::new(event~ : String, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> EventDeadlinepub enum ForecastError {
ForecastEmpty
ForecastNegativeCount
ForecastDeadlineFailure(DeadlineError)
} derive(Debug)pub enum MatrixError {
MatrixDuplicate(String)
MatrixEmpty
MatrixMissing(String)
MatrixDeadlineFailure(DeadlineError)
} derive(Debug)fn MatrixResult::delta(self : MatrixResult, left : String, right : String) -> Result[Int, MatrixError]pub struct ObligationSchedule {
start : Date
rule : ScheduleRule
calendar : Calendar
extension : ExtensionPolicy
}fn ObligationSchedule::new(start~ : Date, rule~ : ScheduleRule, calendar~ : Calendar, extension~ : ExtensionPolicy) -> Result[ObligationSchedule, ScheduleError]fn ObligationSchedule::occurrences(self : ObligationSchedule, count : Int) -> Result[Array[Date], ScheduleError]pub enum PlanError {
EmptyStageLabel
StageIndexOutOfRange(Int)
StageLabelNotFound(String)
StageDeadlineFailure(Int, String, DeadlineError)
StageSuspensionFailure(Int, String, SuspensionError)
} derive(Debug)pub struct PlanStage {
label : String
rule : DateRule
start_rule : StartDateRule
calendar : Calendar
extension : ExtensionPolicy
start_source : StageStartSource
suspension : SuspensionSet?
} derive(Debug)fn PlanStage::new(label~ : String, rule~ : DateRule, start_rule~ : StartDateRule, calendar~ : Calendar, extension~ : ExtensionPolicy, start_source? : StageStartSource, suspension? : SuspensionSet) -> Result[PlanStage, PlanError]pub enum ReminderError {
ReminderNegativeOffset
ReminderDuplicateOffset
ReminderDateFailure
} derive(Debug)fn ReminderPlan::add(self : ReminderPlan, rule : ReminderRule) -> Result[ReminderPlan, ReminderError]pub enum ScheduleError {
ScheduleInvalidInterval
ScheduleInvalidCount
ScheduleDateFailure(DateError)
ScheduleCalendarFailure(CalendarError)
} derive(Debug)pub enum ServiceError {
ServiceInvalidId
ServiceInvalidRule(RuleError)
ServiceDeadlineFailure(DeadlineError)
} derive(Debug)pub struct SuspensionSet {
periods : Array[SuspensionPeriod]
policy : SuspensionPolicy
abort_on : Date?
} derive(Debug)fn SuspensionSet::new(periods~ : Array[SuspensionPeriod], policy? : SuspensionPolicy, abort_on? : Date) -> SuspensionSetInstall
Download zipDeterministic legal and contract deadline calculations with injectable business calendars.