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;
}
}