diff --git a/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs new file mode 100644 index 0000000000..d624964ddd --- /dev/null +++ b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs @@ -0,0 +1,15 @@ +namespace JsonApiDotNetCore.Queries.Parsing; + +/// +/// Converts a constant value within a query string parameter to an . +/// +/// +/// The constant value to convert from. +/// +/// +/// The zero-based position of in the query string parameter value. +/// +/// +/// The converted object instance. +/// +public delegate object ConstantValueConverter(string value, int position); diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs index cbd6ee4b21..19757bbd08 100644 --- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs +++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs @@ -252,13 +252,13 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm) var leftAttribute = (AttrAttribute)leftLastField; - Func constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute); return ParseTypedComparisonRightTerm(leftAttribute.Property.PropertyType, constantValueConverter); } if (leftTerm is FunctionExpression leftFunction) { - Func constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType); return ParseTypedComparisonRightTerm(leftFunction.ReturnType, constantValueConverter); } @@ -266,7 +266,7 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm) $"Internal error: Expected left term to be a function or field chain, instead of '{leftTerm.GetType().Name}': '{leftTerm}'."); } - private QueryExpression ParseTypedComparisonRightTerm(Type leftType, Func constantValueConverter) + private QueryExpression ParseTypedComparisonRightTerm(Type leftType, ConstantValueConverter constantValueConverter) { bool allowNull = RuntimeTypeConverter.CanContainNull(leftType); @@ -329,7 +329,7 @@ protected virtual MatchTextExpression ParseTextMatch(string operatorName) EatSingleCharacterToken(TokenKind.Comma); - Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); LiteralConstantExpression constant = ParseConstant(constantValueConverter); EatSingleCharacterToken(TokenKind.CloseParen); @@ -352,7 +352,7 @@ protected virtual AnyExpression ParseAny() ImmutableHashSet.Builder constantsBuilder = ImmutableHashSet.CreateBuilder(); - Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); + ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute); LiteralConstantExpression constant = ParseConstant(constantValueConverter); constantsBuilder.Add(constant); @@ -489,7 +489,7 @@ private static ResourceType ResolveDerivedType(ResourceType baseType, string der return filter; } - private LiteralConstantExpression ParseConstant(Func constantValueConverter) + private LiteralConstantExpression ParseConstant(ConstantValueConverter constantValueConverter) { int position = GetNextTokenPositionOrEnd(); @@ -514,7 +514,7 @@ private NullConstantExpression ParseNull() throw new QueryParseException("null expected.", position); } - private static Func GetConstantValueConverterForType(Type destinationType) + protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType) { return (stringValue, position) => { @@ -529,7 +529,7 @@ private static Func GetConstantValueConverterForType(Type d }; } - private Func GetConstantValueConverterForAttribute(AttrAttribute attribute) + private ConstantValueConverter GetConstantValueConverterForAttribute(AttrAttribute attribute) { if (attribute is { Property.Name: nameof(Identifiable.Id) }) {