fix optional expression resolving when default value is defined

commit_hash:994994db064cce978e2e3c2d5df7edb312246ca0
This commit is contained in:
gulevsky
2024-10-23 16:25:02 +03:00
parent f4d71c9ce2
commit 09a05b2f89
5 changed files with 110 additions and 9 deletions
@@ -528,7 +528,8 @@ class KotlinEntity(Entity):
property_name=property.name + '_item',
with_template_validators=False
))
if property.supports_expressions and property.default_value_definition is not None:
arg_list.append(property.default_value_var_name)
args = ', '.join(filter(lambda arg: arg, arg_list))
default_value = property.default_value_coalescing(GenerationMode.NORMAL_WITH_TEMPLATES)
return Text(f'{property.declaration_name} = JsonFieldResolver.resolve{optionality_prefix}{expression_prefix}{collection_prefix}({args}){default_value},')
@@ -77,9 +77,9 @@ internal class EntityWithPropertyWithDefaultValueJsonParser(
override fun resolve(context: ParsingContext, template: EntityWithPropertyWithDefaultValueTemplate, data: JSONObject): EntityWithPropertyWithDefaultValue {
val logger = context.logger
return EntityWithPropertyWithDefaultValue(
int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR) ?: INT_DEFAULT_VALUE,
int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR, INT_DEFAULT_VALUE) ?: INT_DEFAULT_VALUE,
nested = JsonFieldResolver.resolveOptional(context, logger, template.nested, data, "nested", component.entityWithPropertyWithDefaultValueNestedJsonTemplateResolver, component.entityWithPropertyWithDefaultValueNestedJsonEntityParser),
url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR) ?: URL_DEFAULT_VALUE,
url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR, URL_DEFAULT_VALUE) ?: URL_DEFAULT_VALUE,
)
}
}
@@ -156,9 +156,9 @@ internal class EntityWithPropertyWithDefaultValueNestedJsonParser(
override fun resolve(context: ParsingContext, template: EntityWithPropertyWithDefaultValueTemplate.NestedTemplate, data: JSONObject): EntityWithPropertyWithDefaultValue.Nested {
val logger = context.logger
return EntityWithPropertyWithDefaultValue.Nested(
int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR) ?: INT_DEFAULT_VALUE,
int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR, INT_DEFAULT_VALUE) ?: INT_DEFAULT_VALUE,
nonOptional = JsonFieldResolver.resolveExpression(context, logger, template.nonOptional, data, "non_optional", TYPE_HELPER_STRING),
url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR) ?: URL_DEFAULT_VALUE,
url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR, URL_DEFAULT_VALUE) ?: URL_DEFAULT_VALUE,
)
}
}
@@ -106,7 +106,7 @@ internal class EntityWithSimplePropertiesJsonParser(
color = JsonFieldResolver.resolveOptionalExpression(context, logger, template.color, data, "color", TYPE_HELPER_COLOR, STRING_TO_COLOR_INT),
double = JsonFieldResolver.resolveOptionalExpression(context, logger, template.double, data, "double", TYPE_HELPER_DOUBLE, NUMBER_TO_DOUBLE),
id = JsonFieldResolver.resolveOptional(context, logger, template.id, data, "id", NUMBER_TO_INT) ?: ID_DEFAULT_VALUE,
integer = JsonFieldResolver.resolveOptionalExpression(context, logger, template.integer, data, "integer", TYPE_HELPER_INT, NUMBER_TO_INT) ?: INTEGER_DEFAULT_VALUE,
integer = JsonFieldResolver.resolveOptionalExpression(context, logger, template.integer, data, "integer", TYPE_HELPER_INT, NUMBER_TO_INT, INTEGER_DEFAULT_VALUE) ?: INTEGER_DEFAULT_VALUE,
positiveInteger = JsonFieldResolver.resolveOptionalExpression(context, logger, template.positiveInteger, data, "positive_integer", TYPE_HELPER_INT, NUMBER_TO_INT, POSITIVE_INTEGER_VALIDATOR),
string = JsonFieldResolver.resolveOptionalExpression(context, logger, template.string, data, "string", TYPE_HELPER_STRING),
url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI),
@@ -69,7 +69,7 @@ internal class EntityWithStringEnumPropertyWithDefaultValueJsonParser(
override fun resolve(context: ParsingContext, template: EntityWithStringEnumPropertyWithDefaultValueTemplate, data: JSONObject): EntityWithStringEnumPropertyWithDefaultValue {
val logger = context.logger
return EntityWithStringEnumPropertyWithDefaultValue(
value = JsonFieldResolver.resolveOptionalExpression(context, logger, template.value, data, "value", TYPE_HELPER_VALUE, EntityWithStringEnumPropertyWithDefaultValue.Value.FROM_STRING) ?: VALUE_DEFAULT_VALUE,
value = JsonFieldResolver.resolveOptionalExpression(context, logger, template.value, data, "value", TYPE_HELPER_VALUE, EntityWithStringEnumPropertyWithDefaultValue.Value.FROM_STRING, VALUE_DEFAULT_VALUE) ?: VALUE_DEFAULT_VALUE,
)
}
}
@@ -300,6 +300,30 @@ public class JsonFieldResolver {
return null;
}
@Nullable
public static <V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@NonNull final ParsingErrorLogger logger,
@NonNull final Field<Expression<V>> field,
@NonNull final JSONObject data,
@NonNull final String key,
@NonNull final TypeHelper<V> typeHelper,
@Nullable final Expression<V> defaultValue
) {
if (field.overridable && data.has(key)) {
return JsonExpressionParser.readOptionalExpression(
context, logger, data, key, typeHelper, doNotConvert(), defaultValue);
} else if (field.type == Field.TYPE_VALUE) {
return ((Field.Value<Expression<V>>) field).value;
} else if (field.type == Field.TYPE_REFERENCE) {
String reference = ((Field.Reference<?>) field).reference;
return JsonExpressionParser.readOptionalExpression(
context, logger, data, reference, typeHelper, doNotConvert(), defaultValue);
}
return null;
}
@Nullable
public static <R, V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@@ -322,6 +346,31 @@ public class JsonFieldResolver {
return null;
}
@Nullable
public static <R, V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@NonNull final ParsingErrorLogger logger,
@NonNull final Field<Expression<V>> field,
@NonNull final JSONObject data,
@NonNull final String key,
@NonNull final TypeHelper<V> typeHelper,
@NonNull final Function1<R, V> converter,
@Nullable final Expression<V> defaultValue
) {
if (field.overridable && data.has(key)) {
return JsonExpressionParser.readOptionalExpression(
context, logger, data, key, typeHelper, converter, defaultValue);
} else if (field.type == Field.TYPE_VALUE){
return ((Field.Value<Expression<V>>) field).value;
} else if (field.type == Field.TYPE_REFERENCE) {
String reference = ((Field.Reference<?>) field).reference;
return JsonExpressionParser.readOptionalExpression(
context, logger, data, reference, typeHelper, converter, defaultValue);
}
return null;
}
@Nullable
public static <V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@@ -344,6 +393,31 @@ public class JsonFieldResolver {
return null;
}
@Nullable
public static <V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@NonNull final ParsingErrorLogger logger,
@NonNull final Field<Expression<V>> field,
@NonNull final JSONObject data,
@NonNull final String key,
@NonNull final TypeHelper<V> typeHelper,
@NonNull final ValueValidator<V> validator,
@Nullable final Expression<V> defaultValue
) {
if (field.overridable && data.has(key)) {
return JsonExpressionParser.readOptionalExpression(
context, logger, data, key, typeHelper, validator, defaultValue);
} else if (field.type == Field.TYPE_VALUE) {
return ((Field.Value<Expression<V>>) field).value;
} else if (field.type == Field.TYPE_REFERENCE) {
String reference = ((Field.Reference<?>) field).reference;
return JsonExpressionParser.readOptionalExpression(
context, logger, data, reference, typeHelper, validator, defaultValue);
}
return null;
}
@Nullable
public static <R, V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@@ -357,13 +431,39 @@ public class JsonFieldResolver {
) {
if (field.overridable && data.has(key)) {
return JsonExpressionParser.readOptionalExpression(
context, logger, data, key, typeHelper, converter, validator);
context, logger, data, key, typeHelper, converter, validator, null);
} else if (field.type == Field.TYPE_VALUE) {
return ((Field.Value<Expression<V>>) field).value;
} else if (field.type == Field.TYPE_REFERENCE) {
String reference = ((Field.Reference<?>) field).reference;
return JsonExpressionParser.readOptionalExpression(
context, logger, data, reference, typeHelper, converter, validator);
context, logger, data, reference, typeHelper, converter, validator, null);
}
return null;
}
@Nullable
public static <R, V> Expression<V> resolveOptionalExpression(
@NonNull final ParsingContext context,
@NonNull final ParsingErrorLogger logger,
@NonNull final Field<Expression<V>> field,
@NonNull final JSONObject data,
@NonNull final String key,
@NonNull final TypeHelper<V> typeHelper,
@NonNull final Function1<R, V> converter,
@NonNull final ValueValidator<V> validator,
@Nullable final Expression<V> defaultValue
) {
if (field.overridable && data.has(key)) {
return JsonExpressionParser.readOptionalExpression(
context, logger, data, key, typeHelper, converter, validator, defaultValue);
} else if (field.type == Field.TYPE_VALUE) {
return ((Field.Value<Expression<V>>) field).value;
} else if (field.type == Field.TYPE_REFERENCE) {
String reference = ((Field.Reference<?>) field).reference;
return JsonExpressionParser.readOptionalExpression(
context, logger, data, reference, typeHelper, converter, validator, defaultValue);
}
return null;