RenderUtil.java
package org.klojang.templates;
import org.klojang.path.Path;
import java.util.Set;
import java.util.function.IntFunction;
import static org.klojang.templates.RenderErrorCode.STRINGIFIER_NOT_NULL_RESISTANT;
import static org.klojang.templates.RenderErrorCode.STRINGIFIER_RETURNED_NULL;
final class RenderUtil {
static String stringify(
Object value,
Stringifier stringifier,
VariablePart part,
VarGroup adhoc) {
VarGroup group = part.varGroup().orElse(adhoc);
if (value == null && group == VarGroup.DEF && part.placeholder() != null) {
return part.placeholder();
}
String s;
try {
s = stringifier.stringify(value);
} catch (NullPointerException e) {
throw STRINGIFIER_NOT_NULL_RESISTANT.getException(part.name(), group);
}
if (s == null) {
throw STRINGIFIER_RETURNED_NULL.getException(part.name(), group);
}
return s;
}
static RenderSession ifNotSet(
SoloSession session,
Path path,
IntFunction<Object> valueGenerator,
VarGroup varGroup) {
if (!session.state().isSet(path)) {
setPath(session, path, varGroup, true, valueGenerator);
}
return session;
}
static void setPath(
SoloSession session,
Path path,
VarGroup group,
boolean force,
IntFunction<Object> valueGenerator) {
if (path.size() == 1) {
session.setVar(path.segment(0), group, valueGenerator.apply(0));
} else {
Template t = session.getNestedTemplate(path.segment(0));
SoloSession[] children = session.state().getChildSessions(t);
if (children == null) {
if (!force) {
return;
}
children = session.state().createChildSessions(t, null, 1);
}
if (path.size() == 2) {
for (int i = 0; i < children.length; ++i) {
children[i].setVar(path.segment(1), group, valueGenerator.apply(i));
}
} else {
for (SoloSession child : children) {
setPath(child, path.shift(), group, force, valueGenerator);
}
}
}
}
static void enableRecursive(SoloSession s0, Template t0) {
s0.state().createChildSessions(t0, null, 1);
if (!t0.getNestedTemplates().isEmpty()) {
SoloSession s = s0.state().getChildSessions(t0)[0];
t0.getNestedTemplates().forEach(t -> enableRecursive(s, t));
}
}
static void enableRecursive(SoloSession s0, Template t0, Set<String> names) {
if (names.contains(t0.getName())) {
s0.state().createChildSessions(t0, null, 1);
if (!t0.getNestedTemplates().isEmpty()) {
SoloSession s = s0.state().getChildSessions(t0)[0];
t0.getNestedTemplates().forEach(t -> enableRecursive(s, t, names));
}
}
}
}