using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Luticate2.Auth.Dbo; using Luticate2.Auth.Dbo.Result; using Luticate2.Auth.Interfaces; namespace Luticate2.Auth.Business.Fields.DMEC { public class LuExpressionConverterEnumerable : ILuExpressionConverter { public IServiceProvider ServiceProvider { get; } public LuExpressionConverterEnumerable(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } protected LuResult ConvertOther(Type typeFrom, Stack expressions, Expression baseExpression, LuExpressionConverterOptions options) { var type = typeof(ILuExpressionConverter<>); var gtype = type.MakeGenericType(typeFrom); var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype); if (converter == null) { return LuResult.Error(LuStatus.InternalError.ToInt(), $"Could not get service: {gtype}>"); } return converter.ConvertExpression(expressions, baseExpression, options); } public LuResult ConvertExpression(Stack expressions, Expression baseExpression, LuExpressionConverterOptions options) { if (!expressions.Any()) { return LuResult.Ok(baseExpression); } var expression = expressions.Pop(); if (expression is MethodCallExpression methodCallExpression) { var argumentsModel = new List(); foreach (var argumentDbo in methodCallExpression.Arguments) { var converter = new LuExpressionConverterVisitor(options, ServiceProvider); var result = converter.Visit(argumentDbo); argumentsModel.Add(result); } var newExpression = Expression.Call(baseExpression, methodCallExpression.Method, argumentsModel); return ConvertOther(newExpression.Type, expressions, newExpression, options); } return LuResult.Error(LuStatus.InternalError.ToInt(), "Not supported expression"); } } }