Skip to content

Commit ded32a7

Browse files
Allow to override valueconverter on FilterParser (#1401)
1 parent e515746 commit ded32a7

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace JsonApiDotNetCore.Queries.Parsing;
2+
3+
/// <summary>
4+
/// Converts a constant value within a query string parameter to an <see cref="object" />.
5+
/// </summary>
6+
/// <param name="value">
7+
/// The constant value to convert from.
8+
/// </param>
9+
/// <param name="position">
10+
/// The zero-based position of <paramref name="value" /> in the query string parameter value.
11+
/// </param>
12+
/// <returns>
13+
/// The converted object instance.
14+
/// </returns>
15+
public delegate object ConstantValueConverter(string value, int position);

src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -252,21 +252,21 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm)
252252

253253
var leftAttribute = (AttrAttribute)leftLastField;
254254

255-
Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
255+
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
256256
return ParseTypedComparisonRightTerm(leftAttribute.Property.PropertyType, constantValueConverter);
257257
}
258258

259259
if (leftTerm is FunctionExpression leftFunction)
260260
{
261-
Func<string, int, object> constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
261+
ConstantValueConverter constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
262262
return ParseTypedComparisonRightTerm(leftFunction.ReturnType, constantValueConverter);
263263
}
264264

265265
throw new InvalidOperationException(
266266
$"Internal error: Expected left term to be a function or field chain, instead of '{leftTerm.GetType().Name}': '{leftTerm}'.");
267267
}
268268

269-
private QueryExpression ParseTypedComparisonRightTerm(Type leftType, Func<string, int, object> constantValueConverter)
269+
private QueryExpression ParseTypedComparisonRightTerm(Type leftType, ConstantValueConverter constantValueConverter)
270270
{
271271
bool allowNull = RuntimeTypeConverter.CanContainNull(leftType);
272272

@@ -329,7 +329,7 @@ protected virtual MatchTextExpression ParseTextMatch(string operatorName)
329329

330330
EatSingleCharacterToken(TokenKind.Comma);
331331

332-
Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
332+
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
333333
LiteralConstantExpression constant = ParseConstant(constantValueConverter);
334334

335335
EatSingleCharacterToken(TokenKind.CloseParen);
@@ -352,7 +352,7 @@ protected virtual AnyExpression ParseAny()
352352

353353
ImmutableHashSet<LiteralConstantExpression>.Builder constantsBuilder = ImmutableHashSet.CreateBuilder<LiteralConstantExpression>();
354354

355-
Func<string, int, object> constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
355+
ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
356356
LiteralConstantExpression constant = ParseConstant(constantValueConverter);
357357
constantsBuilder.Add(constant);
358358

@@ -489,7 +489,7 @@ private static ResourceType ResolveDerivedType(ResourceType baseType, string der
489489
return filter;
490490
}
491491

492-
private LiteralConstantExpression ParseConstant(Func<string, int, object> constantValueConverter)
492+
private LiteralConstantExpression ParseConstant(ConstantValueConverter constantValueConverter)
493493
{
494494
int position = GetNextTokenPositionOrEnd();
495495

@@ -514,7 +514,7 @@ private NullConstantExpression ParseNull()
514514
throw new QueryParseException("null expected.", position);
515515
}
516516

517-
private static Func<string, int, object> GetConstantValueConverterForType(Type destinationType)
517+
protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType)
518518
{
519519
return (stringValue, position) =>
520520
{
@@ -529,7 +529,7 @@ private static Func<string, int, object> GetConstantValueConverterForType(Type d
529529
};
530530
}
531531

532-
private Func<string, int, object> GetConstantValueConverterForAttribute(AttrAttribute attribute)
532+
private ConstantValueConverter GetConstantValueConverterForAttribute(AttrAttribute attribute)
533533
{
534534
if (attribute is { Property.Name: nameof(Identifiable<object>.Id) })
535535
{

0 commit comments

Comments
 (0)