1 import Base 2 import ./world.bend as W 3 import ./system.bend as Sys 4 import ./machine_handlers.bend as H 5 import ./machine_handler_bundle.bend as B 6 import ./ordinary_machine_handler_bundle.bend as Classic 7 import ./ordinary_machine_handler_bundle_context.bend as Context 8 import ./execution_trace.bend as Trace 9 import ./trace_facts.bend as Facts 10 11 def observed(fact:Facts.Fact,barrier:Bool,identity:Maybe<&2,Trace.Identity>) -> Trace.TraceEvent: 12 match barrier identity: 13 case True{} _:Trace.BarrierOperationObserved{fact} 14 case False{} Some{identity}:Trace.OperationObserved{identity,fact} 15 case False{} None{}:Trace.ExecutionOperationObserved{fact} 16 def events(items:List<&2,Facts.Fact>,+barrier:Bool,+identity:Maybe<&2,Trace.Identity>) -> List<&2,Trace.TraceEvent>: 17 match items: 18 case []:[] 19 case Facts.BoundaryFact{Facts.PhaseBoundary{name}} <> rest:Trace.PhaseEntered{name} <> events(rest,False{},None{}) 20 case Facts.BoundaryFact{Facts.BarrierEntered{}} <> rest:events(rest,True{},None{}) 21 case Facts.BoundaryFact{Facts.BarrierFinished{}} <> rest:Trace.DeferredApplied{} <> events(rest,False{},None{}) 22 case Facts.HandlerFact{+namespace,+id,+name,ordinal,phase,from,to,result} <> rest:Trace.ExecutionOperationObserved{Facts.HandlerFact{namespace,id,name,ordinal,phase,from,to,result}} <> events(rest,barrier,Some{Trace.Identity{namespace,id,Some{name}}}) 23 case Facts.ReaderFact{+namespace,+id,+name,readerId,domain,lagged} <> rest:Trace.OperationObserved{Trace.Identity{namespace,id,Some{name}},Facts.ReaderFact{namespace,id,name,readerId,domain,lagged}} <> events(rest,barrier,identity) 24 case fact <> rest:observed(fact,barrier,identity) <> events(rest,barrier,identity) 25 def named(~Q:Data,namespace:U32,name:String,status:B.Status,facts:List<&2,Facts.Fact>) -> Trace.Batch: 26 match status: 27 case B.ForeignBundle{}:Trace.Ready{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndRejected{}}]} 28 case B.MissingRequirements{_}:Trace.Ready{[Trace.ScheduleAdmissionRefused{namespace,name,Trace.EndMissing{}}]} 29 case B.HandlerFailed{_,error}:Trace.Ready{Trace.ScheduleStarted{namespace,name} <> List.append(&2,Trace.TraceEvent,events(facts,False{},None{}),[Trace.ScheduleEnded{Trace.EndFailed{error}}])} 30 case _:Trace.Ready{Trace.ScheduleStarted{namespace,name} <> List.append(&2,Trace.TraceEvent,events(facts,False{},None{}),[Trace.ScheduleEnded{Trace.EndOk{}}])} 31 def captured(~S:Data,~K:Data,~V:Data,~Q:Data,~C:Type,~R:Type,~E:Data,~runner:W.World -> H.Invocation -> Sys.Outcome,String,Unit>,name:String,value:Context.MarkerResult) -> Classic.MarkerResult & Trace.Batch: 32 match value: 33 case Context.MarkerResult{result,steps,observations,Facts.Off{}}:(Classic.MarkerResult{result,steps,observations},Trace.Disabled{}) 34 case Context.MarkerResult{B.Returned{B.Bundle{+namespace,entries},world,+status},steps,observations,Facts.On{facts}}:(Classic.MarkerResult{B.Returned{B.Bundle{namespace,entries},world,status},steps,observations},named(~Q,namespace,name,status,List.reverse(&2,Facts.Fact,facts))) 35 case Context.MarkerResult{B.InternalOwnerRemainder{+namespace,recovery,world,+status},steps,observations,Facts.On{facts}}:(Classic.MarkerResult{B.InternalOwnerRemainder{namespace,recovery,world,status},steps,observations},named(~Q,namespace,name,status,List.reverse(&2,Facts.Fact,facts)))