public void CreateEntity <TRecord>(IRecordObjectGetter <TRecord> getter, Func <IPaperContext, TPaperInstance, TData, TRecord, Entity> entityFactory) { this.statements.Add(ctx => { if (ctx.OutgoingData.IsPayload) { return; } var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var node = getter.GetNode(ctx); node.Entity = entityFactory.Invoke(ctx, host, data, node.Record); if (node.Parent?.Entity is Entity parent) { parent.Add(node.Entity); } else { ctx.Cache[EntityKey] = node.Entity; } }); }
public IRecordCollectionGetter <TRecord> PopulateRecords <TRef, TRecord>(IRecordObjectGetter <TRef> @ref, Func <IPaperContext, TPaperInstance, TData, TRef, ICollection <TRecord> > populator) { var recordsKey = $"Records-{Guid.NewGuid():B}"; var nodesKey = $"Nodes-{recordsKey}"; this.statements.Add(ctx => { var parent = @ref.GetNode(ctx); var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var records = populator.Invoke(ctx, host, data, parent.Record); var nodes = records.Select(x => new Node <TRecord> { Parent = parent, Record = x }).ToArray(); ctx.Cache[recordsKey] = records; ctx.Cache[nodesKey] = nodes; }); return(new RecordCollectionGetter <TRecord>(recordsKey, nodesKey)); }
public IRecordObjectGetter <TRecord> PopulateRecord <TRef, TRecord>(IRecordObjectGetter <TRef> @ref, Func <IPaperContext, TPaperInstance, TData, TRef, TRecord> populator) { var recordKey = $"Record-{Guid.NewGuid():B}"; var nodeKey = $"Node-{recordKey}"; this.statements.Add(ctx => { var parent = @ref.GetNode(ctx); var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var record = populator.Invoke(ctx, host, data, parent.Record); var node = new Node <TRecord> { Parent = parent, Record = record }; ctx.Cache[recordKey] = record; ctx.Cache[nodeKey] = node; }); return(new RecordGetter <TRecord>(recordKey, nodeKey)); }
public void FormatEntity <TRecord>(IRecordObjectGetter <TRecord> getter, Action <IPaperContext, TPaperInstance, TData, TRecord, Entity> formatter) { this.statements.Add(ctx => { if (ctx.OutgoingData.IsPayload) { return; } var host = (TPaperInstance)ctx.Cache[PaperInstanceKey]; var data = (TData)ctx.Cache[DataKey]; var node = getter.GetNode(ctx); if (node.Entity == null) { node.Entity = CreateDefaultEntity(node.Record); var parent = node.Parent?.Entity ?? (Entity)ctx.Cache[EntityKey]; parent.Add(node.Entity); } formatter.Invoke(ctx, host, data, node.Record, node.Entity); }); }