Mercurial Hosting > nabble
diff src/nabble/naml/compiler/InterpreterImpl.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/naml/compiler/InterpreterImpl.java Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,141 @@ +package nabble.naml.compiler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + + +class InterpreterImpl implements Interpreter { + private static final Logger logger = LoggerFactory.getLogger(Compiler.class); + + final CommandSpec cmdSpec; + final RunState runState; + private final Map<Class,Integer> inStack; + private final Map<String,?> args; + private final Encoder oldEncoder; + + InterpreterImpl(CommandSpec cmdSpec,RunState runState,Map<Class,Integer> inStack,Map<String,?> args) { + this.cmdSpec = cmdSpec; + this.runState = runState; + this.inStack = inStack; + this.args = args; + this.oldEncoder = runState.getEncoder(); + } + + public Object getArg(String param) { + return args.get(param); + } + + public String getArgString(String param) { + return Template.stringValue( getArg(param) ); + } + + public Template template() { + return runState.template(); + } + + public <T> T getFromStack(Class<T> cls) { + Integer i = inStack.get(cls); + if( i == null ) + throw new RuntimeException(""+cls+" not found in stack"); + return cls.cast(runState.getFromStack(i)); + } + + public int callDepth() { + return runState.callDepth(); + } + + public final <T> T getArgAsNamespace(Class<T> cls,String param) { + String s = getArgString(param); + if( s == null ) + return null; + return cls.cast(runState.getNamespace(s)); + } + + public boolean hasNamespace(String namespace) { + return runState.hasNamespace(namespace); + } + + public boolean isInCommandStack(String commandName) { + return runState.isInCommandStack(commandName); + } + + + // from AbstractInterpreter + + public final boolean hasModule(String moduleName) { + return runState.program().moduleNames().contains(moduleName); + } + + public final boolean getArgAsBoolean(String param) + throws BooleanFormatException + { + try { + return Template.booleanValue( getArg(param) ); + } catch(BooleanFormatException e) { + throw new BooleanFormatException( newMsg(param,e) ); + } + } + + public final boolean getArgAsBoolean(String param,boolean defaultValue) + throws BooleanFormatException + { + try { + return Template.booleanValue( getArg(param), defaultValue ); + } catch(BooleanFormatException e) { + throw new BooleanFormatException( newMsg(param,e) ); + } + } + + public final int getArgAsInt(String param) + throws NumberFormatException + { + try { + return Template.intValue( getArg(param) ); + } catch(NumberFormatException e) { + throw new NumberFormatException( newMsg(param,e) ); + } + } + + public int getArgAsInt(String param, int defaultValue) + throws NumberFormatException + { + try { + return Template.intValue( getArg(param), defaultValue ); + } catch(NumberFormatException e) { + throw new NumberFormatException( newMsg(param,e) ); + } + } + + public final long getArgAsLong(String param) + throws NumberFormatException + { + try { + return Template.longValue( getArg(param) ); + } catch(NumberFormatException e) { + throw new NumberFormatException( newMsg(param,e) ); + } + } + + private static String newMsg(String param,Exception e) { + return "For argument: \"" + param + "\" - " + e.getMessage(); + } + + public String encode(String s) { + return s==null ? null : getEncoder().encode(s); + } + + public Encoder getEncoder() { + return runState.getEncoder(); + } + + public void setEncoder(Encoder encoder) { + runState.setEncoder(encoder); + } + + void close() { + runState.setEncoder(oldEncoder); + } + +}