elsa-core/src/scripting/Elsa.Scripting.Liquid/Services/LiquidTemplateManager.cs

59 lines
2 KiB
C#
Raw Normal View History

using System;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Elsa.Scripting.Liquid.Extensions;
using Elsa.Scripting.Liquid.Options;
using Fluid;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
namespace Elsa.Scripting.Liquid.Services
{
public class LiquidTemplateManager : ILiquidTemplateManager
{
2021-03-26 16:26:44 +00:00
private readonly LiquidParser _parser;
private readonly IMemoryCache _memoryCache;
private readonly IServiceProvider _serviceProvider;
private readonly LiquidOptions _options;
2021-03-26 16:26:44 +00:00
public LiquidTemplateManager(LiquidParser parser, IMemoryCache memoryCache, IOptions<LiquidOptions> options, IServiceProvider serviceProvider)
{
2021-03-26 16:26:44 +00:00
_parser = parser;
2020-10-10 15:13:52 +00:00
_memoryCache = memoryCache;
_serviceProvider = serviceProvider;
_options = options.Value;
}
2020-11-02 20:04:41 +00:00
public async Task<string?> RenderAsync(string source, TemplateContext context, TextEncoder encoder)
{
if (string.IsNullOrWhiteSpace(source))
2020-11-02 20:04:41 +00:00
return default!;
context.AddFilters(_options, _serviceProvider);
var result = GetCachedTemplate(source);
return await result.RenderAsync(context, encoder);
}
2021-01-21 11:45:10 +00:00
private IFluidTemplate GetCachedTemplate(string source)
{
2021-01-21 11:45:10 +00:00
string error;
var result = _memoryCache.GetOrCreate(
source,
e =>
{
2021-01-21 11:45:10 +00:00
if (!TryParse(source, out var parsed, out error))
TryParse(error, out parsed, out error);
e.SetSlidingExpiration(TimeSpan.FromSeconds(30));
return parsed;
});
return result;
}
2021-01-21 11:45:10 +00:00
public bool Validate(string template, out string error) => TryParse(template, out _, out error);
2021-03-26 16:26:44 +00:00
private bool TryParse(string template, out IFluidTemplate result, out string error) => _parser.TryParse(template, out result, out error);
}
}