view src/nabble/naml/compiler/ScopedInterpreterImpl.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.naml.compiler;

import java.util.Map;


final class ScopedInterpreterImpl<T> extends InterpreterImpl implements ScopedInterpreter<T> {
	private final Map<String,Chunk> dynamicArgs;

	ScopedInterpreterImpl(CommandSpec cmdSpec,RunState runState,Map<Class,Integer> inStack,Map<String,?> args,Map<String,Chunk> dynamicArgs) {
		super(cmdSpec,runState,inStack,args);
		this.dynamicArgs = dynamicArgs;
	}

	public Object getArg(final T scope,String param) {
		if( scope == null )
			throw new TemplateRuntimeException("scope is null");
		if( !cmdSpec.scopedParameters.contains(param) )
			throw new RuntimeException("not scoped parameter");
		Chunk chunk = dynamicArgs.get(param);
		if( chunk != null ) {
			return new BlockWrapper(chunk,runState) {
				void printTo(IPrintWriter out) {
					int pushed = runState.push(scope);
					try {
						super.printTo(out);
					} finally {
						runState.pop(pushed);
					}
				}
			};
		}
		Object obj = getArg(param);
		if( obj != null )
			return obj;
		if( scope instanceof Primitive )
			return scope;
		return runState.saveNamespace(scope);
	}

	public String getArgString(T scope,String param) {
		Object val = getArg(scope,param);
		return val==null ? null : val.toString();
	}

}