| | 1 | | using Fluorite.Strainer.Models.Sorting; |
| | 2 | | using Fluorite.Strainer.Models.Sorting.Terms; |
| | 3 | |
|
| | 4 | | namespace Fluorite.Strainer.Services.Sorting; |
| | 5 | |
|
| | 6 | | public class SortTermParser : ISortTermParser |
| | 7 | | { |
| | 8 | | private readonly ISortingWayFormatter _formatter; |
| | 9 | | private readonly IStrainerOptionsProvider _strainerOptionsProvider; |
| | 10 | | private readonly ISortTermValueParser _sortTermValueParser; |
| | 11 | |
|
| 6 | 12 | | public SortTermParser( |
| 6 | 13 | | ISortingWayFormatter formatter, |
| 6 | 14 | | IStrainerOptionsProvider strainerOptionsProvider, |
| 6 | 15 | | ISortTermValueParser sortTermValueParser) |
| | 16 | | { |
| 6 | 17 | | _formatter = Guard.Against.Null(formatter); |
| 6 | 18 | | _strainerOptionsProvider = Guard.Against.Null(strainerOptionsProvider); |
| 6 | 19 | | _sortTermValueParser = Guard.Against.Null(sortTermValueParser); |
| 6 | 20 | | } |
| | 21 | |
|
| | 22 | | public IList<ISortTerm> GetParsedTerms(string? input) |
| | 23 | | { |
| 5 | 24 | | if (string.IsNullOrEmpty(input)) |
| | 25 | | { |
| 2 | 26 | | return new List<ISortTerm>(); |
| | 27 | | } |
| | 28 | |
|
| 3 | 29 | | var values = _sortTermValueParser.GetParsedValues(input); |
| 3 | 30 | | if (!values.Any()) |
| | 31 | | { |
| 1 | 32 | | return new List<ISortTerm>(); |
| | 33 | | } |
| | 34 | |
|
| 2 | 35 | | var terms = new List<ISortTerm>(); |
| 2 | 36 | | var options = _strainerOptionsProvider.GetStrainerOptions(); |
| | 37 | |
|
| 8 | 38 | | foreach (var value in values) |
| | 39 | | { |
| 2 | 40 | | if (string.IsNullOrWhiteSpace(value)) |
| | 41 | | { |
| | 42 | | continue; |
| | 43 | | } |
| | 44 | |
|
| 2 | 45 | | var sortingWay = _formatter.GetSortingWay(value) ?? options.DefaultSortingWay; |
| 2 | 46 | | var name = _formatter.Unformat(value, sortingWay); |
| 2 | 47 | | var sortTerm = new SortTerm(name) |
| 2 | 48 | | { |
| 2 | 49 | | Input = value, |
| 2 | 50 | | IsDescending = sortingWay == SortingWay.Descending, |
| 2 | 51 | | }; |
| | 52 | |
|
| 2 | 53 | | if (!terms.Any(s => s.Name == sortTerm.Name)) |
| | 54 | | { |
| 2 | 55 | | terms.Add(sortTerm); |
| | 56 | | } |
| | 57 | | } |
| | 58 | |
|
| 2 | 59 | | return terms; |
| | 60 | | } |
| | 61 | | } |