in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/EventStreamGenerator.java [60:106]
public void generateEventStreamInterfaces() {
if (!hasEventStreamOperations()) {
return;
}
final Set<ShapeId> inputEvents = new TreeSet<>();
final Set<ShapeId> outputEvents = new TreeSet<>();
TopDownIndex.of(model).getContainedOperations(serviceShape).forEach(operationShape -> {
streamIndex.getInputInfo(operationShape).ifPresent(eventStreamInfo ->
inputEvents.add(eventStreamInfo.getEventStreamMember().getTarget()));
streamIndex.getOutputInfo(operationShape).ifPresent(eventStreamInfo ->
outputEvents.add(eventStreamInfo.getEventStreamMember().getTarget()));
});
Symbol context = SymbolUtils.createValueSymbolBuilder("Context",
SmithyGoDependency.CONTEXT).build();
writers.useFileWriter(EVENT_STREAM_FILE, settings.getModuleName(), writer -> {
inputEvents.forEach(shapeId -> {
Shape shape = model.expectShape(shapeId);
String writerInterfaceName = getEventStreamWriterInterfaceName(serviceShape, shape);
writer.writeDocs(String.format("%s provides the interface for writing events to a stream.",
writerInterfaceName))
.writeDocs("")
.writeDocs("The writer's Close method must allow multiple concurrent calls.");
writer.openBlock("type $L interface {", "}", writerInterfaceName, () -> {
writer.write("Send($T, $T) error", context, symbolProvider.toSymbol(shape));
writer.write("Close() error");
writer.write("Err() error");
});
});
outputEvents.forEach(shapeId -> {
Shape shape = model.expectShape(shapeId);
String readerInterfaceName = getEventStreamReaderInterfaceName(serviceShape, shape);
writer.writeDocs(String.format("%s provides the interface for reading events from a stream.",
readerInterfaceName))
.writeDocs("")
.writeDocs("The writer's Close method must allow multiple concurrent calls.");
writer.openBlock("type $L interface {", "}", readerInterfaceName, () -> {
writer.write("Events() <-chan $T", symbolProvider.toSymbol(shape));
writer.write("Close() error");
writer.write("Err() error");
});
});
});
}