diff --git a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs index b340c1936..7fc7411c2 100644 --- a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs +++ b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs @@ -9,12 +9,20 @@ using Elsa.Services.Models; using Fluid; using Fluid.Values; using MediatR; +using Microsoft.Extensions.Configuration; using Newtonsoft.Json.Linq; namespace Elsa.Scripting.Liquid.Handlers { public class ConfigureLiquidEngine : INotificationHandler { + private readonly IConfiguration _configuration; + + public ConfigureLiquidEngine(IConfiguration configuration) + { + _configuration = configuration; + } + public Task Handle(EvaluatingLiquidExpression notification, CancellationToken cancellationToken) { var context = notification.TemplateContext; @@ -23,7 +31,6 @@ namespace Elsa.Scripting.Liquid.Handlers options.MemberAccessStrategy.Register(); options.MemberAccessStrategy.Register(); options.MemberAccessStrategy.Register(o => o.Value); - options.MemberAccessStrategy.Register(); options.MemberAccessStrategy.Register((x, name) => x.GetValueAsync(name)); options.MemberAccessStrategy.Register("Input", x => ToFluidValue(x.Input, options)); @@ -34,10 +41,13 @@ namespace Elsa.Scripting.Liquid.Handlers options.MemberAccessStrategy.Register, object>((x, name) => x.GetValueAsync(name)); options.MemberAccessStrategy.Register((x, name) => ((IDictionary) x)[name]); options.MemberAccessStrategy.Register((source, name) => source[name]); + options.MemberAccessStrategy.Register("Configuration", x => new LiquidPropertyAccessor(name => ToFluidValue(GetConfigurationValue(name), options)!)); + options.MemberAccessStrategy.Register((source, name) => source.GetSection(name)); return Task.CompletedTask; } + private ConfigurationSectionWrapper GetConfigurationValue(string name) => new(_configuration.GetSection(name)); private Task ToFluidValue(object? input, TemplateOptions options) => Task.FromResult(FluidValue.Create(input, options)); private Task ToFluidValue(Variables dictionary, string key, TemplateOptions options) => Task.FromResult(!dictionary.Has(key) ? default : FluidValue.Create(dictionary.Get(key), options)); private LiquidActivityModel GetActivityModelAsync(ActivityExecutionContext context, string name) => new(context, name); diff --git a/src/scripting/Elsa.Scripting.Liquid/Helpers/ConfigurationSectionWrapper.cs b/src/scripting/Elsa.Scripting.Liquid/Helpers/ConfigurationSectionWrapper.cs new file mode 100644 index 000000000..de2c2786a --- /dev/null +++ b/src/scripting/Elsa.Scripting.Liquid/Helpers/ConfigurationSectionWrapper.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.Configuration; + +namespace Elsa.Scripting.Liquid.Helpers +{ + public class ConfigurationSectionWrapper + { + private readonly IConfigurationSection _section; + + public ConfigurationSectionWrapper(IConfigurationSection section) + { + _section = section; + } + + public override string ToString() => _section.Value; + + public ConfigurationSectionWrapper GetSection(string name) => new(_section.GetSection(name)); + } +} \ No newline at end of file