All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xlrit.gears.engine.meta.FormValueConverter Maven / Gradle / Ivy

package com.xlrit.gears.engine.meta;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.NullNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.xlrit.gears.engine.snel.EvaluatorContext;
import com.xlrit.gears.engine.snel.Expression;
import com.xlrit.gears.engine.snel.Result;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RequiredArgsConstructor
class FormValueConverter {
	private static final Logger LOG = LoggerFactory.getLogger(FormValueConverter.class);

	private final EvaluatorContext evaluatorCtx;
	private final ObjectMapper objectMapper;

	public JsonNode convert(Object value) {
		if (value == null) {
			return NullNode.instance;
		}
		else if (value instanceof List) {
			ArrayNode result = objectMapper.createArrayNode();
			List list = (List) value;
			for (Object o : list) {
				result.add(convert(o));
			}
			return result;
		}
		else if (value instanceof Map) {
			ObjectNode result = objectMapper.createObjectNode();
			Map map = (Map) value;
			for (Map.Entry entry : map.entrySet()) {
				result.set(entry.getKey(), convert(entry.getValue()));
			}
			return result;
		}
		else if (value instanceof String s) {
			Result result = Expression.eval(s, evaluatorCtx);
			LOG.info("{} -> {}", s, result);
			return result.type().toFormValue(result.value(), objectMapper);
		}
		throw new IllegalArgumentException("Unexpected " + value);
	}
}