| | 1 | | using Fluorite.Strainer.Models.Filtering; |
| | 2 | | using Fluorite.Strainer.Models.Filtering.Terms; |
| | 3 | | using Fluorite.Strainer.Services.Configuration; |
| | 4 | | using System.Linq.Expressions; |
| | 5 | |
|
| | 6 | | namespace Fluorite.Strainer.Services.Filtering; |
| | 7 | |
|
| | 8 | | public class CustomFilteringExpressionProvider : ICustomFilteringExpressionProvider |
| | 9 | | { |
| | 10 | | private readonly IConfigurationCustomMethodsProvider _configurationCustomMethodsProvider; |
| | 11 | |
|
| 5 | 12 | | public CustomFilteringExpressionProvider(IConfigurationCustomMethodsProvider configurationCustomMethodsProvider) |
| | 13 | | { |
| 5 | 14 | | _configurationCustomMethodsProvider = Guard.Against.Null(configurationCustomMethodsProvider); |
| 5 | 15 | | } |
| | 16 | |
|
| | 17 | | public bool TryGetCustomExpression<T>( |
| | 18 | | IFilterTerm filterTerm, |
| | 19 | | string filterTermName, |
| | 20 | | out Expression<Func<T, bool>>? expression) |
| | 21 | | { |
| 4 | 22 | | Guard.Against.Null(filterTerm); |
| 4 | 23 | | Guard.Against.Null(filterTermName); |
| | 24 | |
|
| 4 | 25 | | var customFilterMethods = _configurationCustomMethodsProvider.GetCustomFilterMethods(); |
| 4 | 26 | | if (customFilterMethods.TryGetValue(typeof(T), out var typeCustomFilterMethods) |
| 4 | 27 | | && typeCustomFilterMethods.TryGetValue(filterTermName, out var customMethod)) |
| | 28 | | { |
| 2 | 29 | | var customFilterMethod = (ICustomFilterMethod<T>)customMethod; |
| | 30 | |
|
| 2 | 31 | | expression = customFilterMethod.FilterTermExpression is not null |
| 2 | 32 | | ? customFilterMethod.FilterTermExpression(filterTerm) |
| 2 | 33 | | : customFilterMethod.Expression!; |
| | 34 | |
|
| 2 | 35 | | return true; |
| | 36 | | } |
| | 37 | |
|
| 2 | 38 | | expression = null; |
| | 39 | |
|
| 2 | 40 | | return false; |
| | 41 | | } |
| | 42 | | } |