1 import Base 2 import ./execution_context.bend as Ctx 3 import ./execution_trace.bend as Trace 4 import ./ordinary_app_execution.bend as Execution 5 import ./ordinary_checked_bindings.bend as B 6 import ./checked_condition_schedule.bend as Checked 7 import ./world.bend as W 8 import ./system.bend as Sys 9 import ./schedule.bend as Sch 10 import ./schedule_provision.bend as SP 11 import ./ordinary_schema.bend as Schema 12 import ./ordinary_app_schema.bend as App 13 import ./ordinary_app_composer.bend as Build 14 import ./ordinary_app_schedule.bend as Schedule 15 import ./ordinary_app_recipe.bend as Tree 16 import ./ordinary_app_observation_data.bend as DTO 17 import ./ordinary_app_registration_fields.bend as Records 18 # Check descriptions derive from operational declarations and explicit bindings. 19 # The existing App, recipe, ordinary registration owners and real plan are retained. 20 type Application -> W.World & DTO.Observation,-fold:H -> H & List<&2,Records.Fields>,B:Type,-select:B -> W.World -> U32 -> B.Selection,B>> is Type: 21 Application{app:Schedule.Application,bindings:B.Bindings,B,select>} 22 type Attachment<-Original:Type,-Guards:Type,-Scheduled:Type> is Type: 23 Attached{app:Scheduled} 24 Invalid{app:Original,bindings:Guards} 25 type Description is Data: 26 Description{original:Schedule.Description,bindings:List<&2,B.Description>} 27 def attached(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,schema:Schema.Schema,world:W.World,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,needs:List<&2,SP.Requirement>,result:Checked.Attachment) -> Attachment,B.Bindings,B,select>,Application>: 28 match result: 29 case Checked.Attached{Sch.Schedule{namespace,name,steps,(owners,bindings)}}:Attached{Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings}} 30 case Checked.AttachmentRejected{Sch.Schedule{namespace,name,steps,owners},bindings}:Invalid{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings} 31 def attach(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,value:Schedule.Application,bindings:B.Bindings,B,select>) -> Attachment,B.Bindings,B,select>,Application>: 32 match value: 33 case Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs}:attached(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,schema,world,recipe,debug,plan,needs,Checked.attach(~S,~C,~R,~E,~H,~B,~select,Sch.Schedule{namespace,name,steps,owners},bindings)) 34 def enabled(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,value:Application,flag:Bool) -> Application: 35 match value: 36 case Application{app,bindings}:Application{Schedule.enabled(~S,~C,~R,~E,~H,~Rows,~observe,~fold,app,flag),bindings} 37 def snapshot_present(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,app:Schedule.Application,view:Schedule.Description,bindings:B.Bindings,B,select>) -> Application & Maybe<&2,Description>: 38 match bindings: 39 case B.Bindings{owner,+facts}:(Application{app,B.Bindings{owner,facts}},Some{Description{view,facts}}) 40 def snapshot_returned(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,bindings:B.Bindings,B,select>,observed:Schedule.Application & Maybe<&2,Schedule.Description>) -> Application & Maybe<&2,Description>: 41 match observed: 42 case (app,None{}):(Application{app,bindings},None{}) 43 case (app,Some{view}):snapshot_present(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,app,view,bindings) 44 def snapshot(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,value:Application) -> Application & Maybe<&2,Description>: 45 match value: 46 case Application{app,bindings}:snapshot_returned(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,bindings,Schedule.snapshot(~S,~C,~R,~E,~H,~Rows,~observe,~fold,app)) 47 def executed(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,schema:Schema.Schema,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,needs:List<&2,SP.Requirement>,result:Sch.RunResult,B,select>,Checked.Error>) -> Schedule.RunResult,S,Checked.Error>: 48 match result: 49 case Sch.Finished{Sch.Schedule{namespace,name,steps,(owners,bindings)},world,observations}:Schedule.Finished{Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings},observations} 50 case Sch.Failed{Sch.Schedule{namespace,name,steps,(owners,bindings)},world,error,observations}:Schedule.Failed{Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings},error,observations} 51 case Sch.Rejected{Sch.Schedule{namespace,name,steps,(owners,bindings)},world}:Schedule.Rejected{Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings}} 52 def provisioned(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,schema:Schema.Schema,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,result:SP.ProvisionResult,B,select>,Checked.Error>) -> Schedule.RunResult,S,Checked.Error>: 53 match result: 54 case SP.Missing{SP.Provisioned{Sch.Schedule{namespace,name,steps,(owners,bindings)},needs},world,missing}:Schedule.Missing{Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings},missing} 55 case SP.Executed{result,needs}:executed(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,schema,recipe,debug,plan,needs,result) 56 def run_classic(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,~dispatch:H -> W.World -> U32 -> H & Sys.Outcome,BodyError,Unit>,~provision:W.World -> W.World & List<&2,SP.Requirement>,value:Application) -> Schedule.RunResult,S,Checked.Error>: 57 match value: 58 case Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},bindings}:provisioned(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,schema,recipe,debug,plan,Checked.run_provisioned(~S,~C,~R,~E,~H,~B,~select,~BodyError,~dispatch,~provision,SP.Provisioned{Sch.Schedule{namespace,name,steps,(owners,bindings)},needs},world)) 59 60 def trace_status(~Error:Data,value:Trace.Status) -> Trace.Status>: 61 match value: 62 case Trace.SystemOk{}:Trace.SystemOk{} 63 case Trace.SystemError{error}:Trace.SystemError{Checked.SystemError{error}} 64 def trace_completion(~Error:Data,value:Trace.Completion) -> Trace.Completion>: 65 match value: 66 case Trace.EndOk{}:Trace.EndOk{} 67 case Trace.EndFailed{error}:Trace.EndFailed{Checked.SystemError{error}} 68 case Trace.EndRejected{}:Trace.EndRejected{} 69 case Trace.EndMissing{}:Trace.EndMissing{} 70 def trace_events(~Error:Data,events:List<&2,Trace.TraceEvent>) -> List<&2,Trace.TraceEvent>>: 71 match events: 72 case []:[] 73 case Trace.ScheduleStarted{namespace,name} <> rest:Trace.ScheduleStarted{namespace,name} <> trace_events(~Error,rest) 74 case Trace.PhaseEntered{name} <> rest:Trace.PhaseEntered{name} <> trace_events(~Error,rest) 75 case Trace.SystemCompleted{identity,before,after,status} <> rest:Trace.SystemCompleted{identity,before,after,trace_status(~Error,status)} <> trace_events(~Error,rest) 76 case Trace.OperationObserved{identity,fact} <> rest:Trace.OperationObserved{identity,fact} <> trace_events(~Error,rest) 77 case Trace.BarrierOperationObserved{fact} <> rest:Trace.BarrierOperationObserved{fact} <> trace_events(~Error,rest) 78 case Trace.ExecutionOperationObserved{fact} <> rest:Trace.ExecutionOperationObserved{fact} <> trace_events(~Error,rest) 79 case Trace.SystemSkipped{id} <> rest:Trace.SystemSkipped{id} <> trace_events(~Error,rest) 80 case Trace.DeferredApplied{} <> rest:Trace.DeferredApplied{} <> trace_events(~Error,rest) 81 case Trace.ScheduleEnded{outcome} <> rest:Trace.ScheduleEnded{trace_completion(~Error,outcome)} <> trace_events(~Error,rest) 82 case Trace.ScheduleAdmissionRefused{namespace,name,outcome} <> rest:Trace.ScheduleAdmissionRefused{namespace,name,trace_completion(~Error,outcome)} <> trace_events(~Error,rest) 83 def context_batch(~Error:Data,namespace:U32,name:String,observations:List<&2,Sch.Observation>,state:Execution.ExecutionState,outcome:Trace.Completion>) -> Trace.Batch>: 84 match state: 85 case Execution.Off{}:Trace.Disabled{} 86 case Execution.On{Execution.Journal{catalog,events}}:Execution.batch(~Checked.Error,namespace,name,observations,Execution.Journal{catalog,trace_events(~Error,events)},outcome) 87 def context_barrier_returned(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,bindings:B.Bindings,B,select>,value:(H & Execution.ExecutionState) & W.World) -> ((H & Execution.ExecutionState) & B.Bindings,B,select>) & W.World: 88 match value: 89 case (owners,world):((owners,bindings),world) 90 def context_barrier(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,owners:(H & Execution.ExecutionState) & B.Bindings,B,select>,world:W.World) -> ((H & Execution.ExecutionState) & B.Bindings,B,select>) & W.World: 91 match owners: 92 case (owners,bindings):context_barrier_returned(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,bindings,Execution.barrier_state(~S,~C,~R,~E,~H,~BodyError,owners,world)) 93 def context_executed(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,result:Sch.RunResult) & B.Bindings,B,select>,Checked.Error>) -> Sch.RunResult,B,select>,Checked.Error> & Trace.Batch>: 94 match result: 95 case Sch.Finished{Sch.Schedule{+namespace,+name,steps,((owners,state),bindings)},world,+observations}:(Sch.Finished{Sch.Schedule{namespace,name,steps,(owners,bindings)},world,observations},context_batch(~BodyError,namespace,name,observations,state,Trace.EndOk{})) 96 case Sch.Failed{Sch.Schedule{+namespace,+name,steps,((owners,state),bindings)},world,+error,+observations}:(Sch.Failed{Sch.Schedule{namespace,name,steps,(owners,bindings)},world,error,observations},context_batch(~BodyError,namespace,name,observations,state,Trace.EndFailed{error})) 97 case Sch.Rejected{Sch.Schedule{+namespace,+name,steps,((owners,state),bindings)},world}:(Sch.Rejected{Sch.Schedule{namespace,name,steps,(owners,bindings)},world},context_batch(~BodyError,namespace,name,[],state,Trace.EndRejected{})) 98 def context_wrapped(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,needs:List<&2,SP.Requirement>,result:Sch.RunResult,B,select>,Checked.Error> & Trace.Batch>) -> SP.ProvisionResult,B,select>,Checked.Error> & Trace.Batch>: 99 match result: 100 case (result,batch):(SP.Executed{result,needs},batch) 101 def context_provisioned(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,result:SP.ProvisionResult) & B.Bindings,B,select>,Checked.Error>) -> SP.ProvisionResult,B,select>,Checked.Error> & Trace.Batch>: 102 match result: 103 case SP.Missing{SP.Provisioned{Sch.Schedule{+namespace,+name,steps,((owners,state),bindings)},needs},world,missing}:(SP.Missing{SP.Provisioned{Sch.Schedule{namespace,name,steps,(owners,bindings)},needs},world,missing},context_batch(~BodyError,namespace,name,[],state,Trace.EndMissing{})) 104 case SP.Executed{result,needs}:context_wrapped(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,needs,context_executed(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,result)) 105 def context_restored(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,schema:Schema.Schema,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,value:SP.ProvisionResult,B,select>,Checked.Error> & Trace.Batch>) -> Execution.Run,S,Checked.Error>: 106 match value: 107 case (result,batch):Execution.Run{provisioned(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,schema,recipe,debug,plan,result),batch} 108 def context_start(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,~dispatch:H -> Ctx.Context> -> U32 -> H & Sys.Outcome>,BodyError,Unit>,~provision:W.World -> W.World & List<&2,SP.Requirement>,schema:Schema.Schema,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,world:W.World,namespace:U32,name:String,steps:List<&2,Sch.Step>,needs:List<&2,SP.Requirement>,owners:H,bindings:B.Bindings,B,select>,state:Execution.ExecutionState) -> Execution.Run,S,Checked.Error>: 109 context_restored(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,schema,recipe,debug,plan,context_provisioned(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,Checked.run_provisioned_with_barrier(~S,~C,~R,~E,~(H & Execution.ExecutionState),~B,~select,~BodyError,~Execution.dispatch_state(~S,~C,~R,~E,~H,~BodyError,~dispatch),~context_barrier(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError),~provision,SP.Provisioned{Sch.Schedule{namespace,name,steps,((owners,state),bindings)},needs},world))) 110 def context_prepared(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,~dispatch:H -> Ctx.Context> -> U32 -> H & Sys.Outcome>,BodyError,Unit>,~provision:W.World -> W.World & List<&2,SP.Requirement>,schema:Schema.Schema,recipe:Tree.Recipe,Rows,observe>,debug:Bool,plan:SP.Plan,world:W.World,namespace:U32,name:String,steps:List<&2,Sch.Step>,needs:List<&2,SP.Requirement>,bindings:B.Bindings,B,select>,value:H & List<&2,Records.Fields>) -> Execution.Run,S,Checked.Error>: 111 match value: 112 case (owners,fields):context_start(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,~dispatch,~provision,schema,recipe,debug,plan,world,namespace,name,steps,needs,owners,bindings,Execution.On{Execution.Journal{Execution.catalog(~S,fields),[]}}) 113 def run(~S:Data,~C:Type,~R:Type,~E:Data,~H:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:H -> H & List<&2,Records.Fields>,~B:Type,~select:B -> W.World -> U32 -> B.Selection,B>,~BodyError:Data,~dispatch:H -> Ctx.Context> -> U32 -> H & Sys.Outcome>,BodyError,Unit>,~provision:W.World -> W.World & List<&2,SP.Requirement>,value:Application) -> Execution.Run,S,Checked.Error>: 114 match value: 115 case Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,False{}}},plan,namespace,name,steps,needs},bindings}:context_start(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,~dispatch,~provision,schema,recipe,False{},plan,world,namespace,name,steps,needs,owners,bindings,Execution.Off{}) 116 case Application{Schedule.Application{App.Application{schema,Build.Registered{world,owners,recipe,True{}}},plan,namespace,name,steps,needs},bindings}:context_prepared(~S,~C,~R,~E,~H,~Rows,~observe,~fold,~B,~select,~BodyError,~dispatch,~provision,schema,recipe,True{},plan,world,namespace,name,steps,needs,bindings,fold(owners))