< Summary

Information
Class: Elsa.Workflows.OutputBindingDestinationResolver
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/OutputBindingDestinationResolver.cs
Line coverage
92%
Covered lines: 26
Uncovered lines: 2
Coverable lines: 28
Total lines: 65
Line coverage: 92.8%
Branch coverage
81%
Covered branches: 13
Total branches: 16
Branch coverage: 81.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Resolve(...)83.33%6685.71%
Resolve(...)75%4491.66%
CreateVariableDestination(...)50%22100%
CreateWorkflowOutputDestination(...)100%22100%
AllowsNull(...)100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/OutputBindingDestinationResolver.cs

#LineLine coverage
 1using Elsa.Workflows.Activities;
 2using Elsa.Workflows.Memory;
 3using Elsa.Workflows.Models;
 4
 5namespace Elsa.Workflows;
 6
 7/// <inheritdoc />
 8public class OutputBindingDestinationResolver : IOutputBindingDestinationResolver
 9{
 10    /// <inheritdoc />
 11    public OutputBindingDestination? Resolve(ActivityExecutionContext activityExecutionContext, Output output)
 12    {
 1013        var reference = output.MemoryBlockReference();
 14
 1015        if (reference.Id == null)
 016            return null;
 17
 1018        if (activityExecutionContext.ExpressionExecutionContext.TryGetBlock(reference, out var block) &&
 1019            block.Metadata is VariableBlockMetadata variableMetadata)
 20        {
 721            return CreateVariableDestination(variableMetadata.Variable);
 22        }
 23
 324        return CreateWorkflowOutputDestination(activityExecutionContext.WorkflowExecutionContext.Workflow, reference.Id)
 25    }
 26
 27    /// <inheritdoc />
 28    public OutputBindingDestination? Resolve(WorkflowGraph workflowGraph, ActivityNode activityNode, Output output)
 29    {
 630        var referenceId = output.MemoryBlockReference().Id;
 31
 632        if (referenceId == null)
 033            return null;
 34
 635        var variable = new[] { activityNode }
 636            .Concat(activityNode.Ancestors())
 737            .Select(x => x.Activity)
 638            .OfType<IVariableContainer>()
 239            .SelectMany(x => x.Variables)
 840            .FirstOrDefault(x => x.Id == referenceId);
 41
 642        if (variable != null)
 243            return CreateVariableDestination(variable);
 44
 445        return CreateWorkflowOutputDestination(workflowGraph.Workflow, referenceId);
 46    }
 47
 48    private static OutputBindingDestination? CreateVariableDestination(Variable variable)
 49    {
 950        var variableType = variable.GetType().GenericTypeArguments.FirstOrDefault();
 951        return variableType == null
 952            ? null
 953            : new(variable.Id, variableType, AllowsNull(variableType), OutputBindingDestinationKind.Variable);
 54    }
 55
 56    private static OutputBindingDestination? CreateWorkflowOutputDestination(Workflow workflow, string referenceId)
 57    {
 1358        var output = workflow.Outputs.FirstOrDefault(x => x.Name == referenceId);
 759        return output == null
 760            ? null
 761            : new(output.Name, output.Type, AllowsNull(output.Type), OutputBindingDestinationKind.WorkflowOutput);
 62    }
 63
 1564    private static bool AllowsNull(Type type) => !type.IsValueType || Nullable.GetUnderlyingType(type) != null;
 65}