in johnzon-jsonlogic/src/main/java/org/apache/johnzon/jsonlogic/JohnzonJsonLogic.java [676:708]
private JsonValue varImpl(final JsonValue config, final JsonValue params) {
switch (config.getValueType()) {
case ARRAY:
final JsonArray values = config.asJsonArray();
if (values.isEmpty()) {
throw new IllegalArgumentException("var should have at least one parameter");
}
final JsonValue accessor = apply(values.get(0), params);
switch (accessor.getValueType()) {
case NUMBER:
final int index = JsonNumber.class.cast(accessor).intValue();
final JsonArray array = params.asJsonArray();
final JsonValue arrayAttribute = index >= array.size() ? null : array.get(index);
return arrayAttribute == null ? (values.size() > 1 ? apply(values.get(1), params) : JsonValue.NULL) : arrayAttribute;
case STRING:
final JsonValue objectAttribute = extractValue(params, JsonString.class.cast(accessor).getString());
return objectAttribute == JsonValue.NULL && values.size() > 1 ? apply(values.get(1), params) : objectAttribute;
default:
throw new IllegalArgumentException("Unsupported var first paraemter: '" + accessor + "', should be string or number");
}
case STRING:
return extractValue(params, JsonString.class.cast(config).getString());
case NUMBER:
final int index = JsonNumber.class.cast(config).intValue();
final JsonArray array = params.asJsonArray();
final JsonValue arrayAttribute = array.size() <= index ? null : array.get(index);
return arrayAttribute == null ? JsonValue.NULL : arrayAttribute;
case OBJECT:
return varImpl(apply(config, params), params);
default:
throw new IllegalArgumentException("Unsupported configuration for var: '" + config + "'");
}
}