package com.github.mustachejava;
import com.github.mustachejava.util.
InternalArrayList;
import com.github.mustachejava.util.
Wrapper;
import java.io.
Writer;
import java.util.
List;
/**
* The ObjectHandler is responsible for creating wrappers to find values
* in scopes at runtime and to coerce those results to the appropriate Java types
*/
public interface
ObjectHandler {
/**
* Find a value named "name" in the array of scopes in reverse order.
*
* @param name the variable name
* @param scopes the ordered list of scopes
* @return a wrapper that can be used to extract a value
*/
Wrapper find(
String name,
List<
Object>
scopes);
/**
* Coerce results to Java native iterables, functions, callables.
*
* @param object transform an unknown type to a known type
* @return the new object
*/
Object coerce(
Object object);
/**
* Iterate over an object by calling Iteration.next for each value.
*
* @param iteration callback for the next iteration
* @param writer the writer to write to
* @param object the current object
* @param scopes the scopes present
* @return the current writer
*/
Writer iterate(
Iteration iteration,
Writer writer,
Object object,
List<
Object>
scopes);
/**
* Call Iteration.next() either 0 (true) or 1 (fale) times.
*
* @param iteration callback for the next iteration
* @param writer the writer to write to
* @param object the current object
* @param scopes the scopes present
* @return the current writer
*/
Writer falsey(
Iteration iteration,
Writer writer,
Object object,
List<
Object>
scopes);
/**
* Each call site has its own binding to allow for fine grained caching without
* a separate parallel hierarchy of objects.
*
* @param name the name that we bound
* @param tc the textual context of the binding site
* @param code the code that was bound
* @return the binding
*/
Binding createBinding(
String name,
TemplateContext tc,
Code code);
/**
* Turns an object into the string representation that should be displayed
* in templates.
*
* @param object the object to be displayed
* @return a string representation of the object.
*/
String stringify(
Object object);
static
List<
Object>
makeList(
Object scope) {
List<
Object>
scopes = new
InternalArrayList<>();
scopes.
add(
scope);
return
scopes;
}
}