package org.scribble.codegen.java.endpointapi.ioifaces;
import java.util.Map;
import org.scribble.codegen.java.endpointapi.InputFutureGenerator;
import org.scribble.codegen.java.endpointapi.ReceiveSocketGenerator;
import org.scribble.codegen.java.endpointapi.ScribSocketGenerator;
import org.scribble.codegen.java.endpointapi.SessionApiGenerator;
import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator;
import org.scribble.codegen.java.util.InterfaceBuilder;
import org.scribble.codegen.java.util.MethodBuilder;
import org.scribble.main.ScribbleException;
import org.scribble.model.endpoint.EState;
import org.scribble.model.endpoint.actions.EAction;
import org.scribble.sesstype.name.GProtocolName;
public class ReceiveInterfaceGenerator extends IOStateInterfaceGenerator
{
public ReceiveInterfaceGenerator(StateChannelApiGenerator apigen, Map<EAction, InterfaceBuilder> actions, EState curr)
{
super(apigen, actions, curr);
}
@Override
public InterfaceBuilder generateType() throws ScribbleException
{
if (this.curr.getAllActions().stream().anyMatch((a) -> !a.isReceive())) // TODO (connect/disconnect)
{
//return null;
throw new RuntimeException("TODO: " + this.curr);
}
return super.generateType();
}
@Override
protected void constructInterface() throws ScribbleException
{
super.constructInterface();
addAsyncDiscardMethod();
}
protected void addAsyncDiscardMethod()
{
GProtocolName gpn = this.apigen.getGProtocolName();
EAction first = this.curr.getActions().iterator().next();
MethodBuilder mb = this.ib.newAbstractMethod();
ReceiveSocketGenerator.setAsyncDiscardHeaderWithoutReturnType(this.apigen, first, mb, InputFutureGenerator.getInputFutureName(this.apigen.getSocketClassName(this.curr)));
this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*");
EState succ = this.curr.getSuccessor(first);
if (succ.isTerminal())
{
ScribSocketGenerator.setNextSocketReturnType(this.apigen, mb, succ);
}
else
{
mb.setReturn("__Succ1"); // Hacky? // FIXME: factor out Succ
}
}
}