using Elsa.Common.Models;
using Elsa.JavaScript.Contracts;
using Elsa.JavaScript.TypeDefinitions.Abstractions;
using Elsa.JavaScript.TypeDefinitions.Models;
using Elsa.Workflows.Management.Contracts;
using Elsa.Workflows.Management.Entities;
using Humanizer;
namespace Elsa.JavaScript.Providers;
///
/// Produces s for common functions.
///
internal class InputFunctionsDefinitionProvider(ITypeAliasRegistry typeAliasRegistry, IWorkflowDefinitionService workflowDefinitionService)
: FunctionDefinitionProvider
{
protected override async ValueTask> GetFunctionDefinitionsAsync(TypeDefinitionContext context)
{
var cancellationToken = context.CancellationToken;
var workflow = context.Workflow;
var workflowDefinition = await workflowDefinitionService.FindWorkflowDefinitionAsync(workflow.Identity.DefinitionId, VersionOptions.SpecificVersion(workflow.Identity.Version), cancellationToken);
return workflowDefinition == null ? Array.Empty() : GetFunctionDefinitionsAsync(workflowDefinition);
}
private IEnumerable GetFunctionDefinitionsAsync(WorkflowDefinition workflowDefinition)
{
// Input argument getters.
foreach (var input in workflowDefinition.Inputs)
{
var pascalName = input.Name.Pascalize();
var variableType = input.Type;
var typeAlias = typeAliasRegistry.TryGetAlias(variableType, out var alias) ? alias : "any";
// get{Input}.
yield return CreateFunctionDefinition(builder => builder.Name($"get{pascalName}").ReturnType(typeAlias));
}
}
}