in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters.java [111:193]
private void generateWaiterOptions(
Model model,
SymbolProvider symbolProvider,
GoWriter writer,
OperationShape operationShape,
String waiterName,
Waiter waiter
) {
String optionsName = generateWaiterOptionsName(waiterName);
String waiterClientName = generateWaiterClientName(waiterName);
StructureShape inputShape = model.expectShape(
operationShape.getInput().get(), StructureShape.class
);
StructureShape outputShape = model.expectShape(
operationShape.getOutput().get(), StructureShape.class
);
Symbol inputSymbol = symbolProvider.toSymbol(inputShape);
Symbol outputSymbol = symbolProvider.toSymbol(outputShape);
writer.write("");
writer.writeDocs(
String.format("%s are waiter options for %s", optionsName, waiterClientName)
);
writer.openBlock("type $L struct {", "}",
optionsName, () -> {
writer.addUseImports(SmithyGoDependency.TIME);
writer.write("");
writer.writeDocs(
"Set of options to modify how an operation is invoked. These apply to all operations "
+ "invoked for this client. Use functional options on operation call to modify "
+ "this list for per operation behavior."
);
Symbol stackSymbol = SymbolUtils.createPointableSymbolBuilder("Stack",
SmithyGoDependency.SMITHY_MIDDLEWARE)
.build();
writer.write("APIOptions []func($P) error", stackSymbol);
writer.write("");
writer.writeDocs(
String.format("MinDelay is the minimum amount of time to delay between retries. "
+ "If unset, %s will use default minimum delay of %s seconds. "
+ "Note that MinDelay must resolve to a value lesser than or equal "
+ "to the MaxDelay.", waiterClientName, waiter.getMinDelay())
);
writer.write("MinDelay time.Duration");
writer.write("");
writer.writeDocs(
String.format("MaxDelay is the maximum amount of time to delay between retries. "
+ "If unset or set to zero, %s will use default max delay of %s seconds. "
+ "Note that MaxDelay must resolve to value greater than or equal "
+ "to the MinDelay.", waiterClientName, waiter.getMaxDelay())
);
writer.write("MaxDelay time.Duration");
writer.write("");
writer.writeDocs("LogWaitAttempts is used to enable logging for waiter retry attempts");
writer.write("LogWaitAttempts bool");
writer.write("");
writer.writeDocs(
"Retryable is function that can be used to override the "
+ "service defined waiter-behavior based on operation output, or returned error. "
+ "This function is used by the waiter to decide if a state is retryable "
+ "or a terminal state.\n\nBy default service-modeled logic "
+ "will populate this option. This option can thus be used to define a custom "
+ "waiter state with fall-back to service-modeled waiter state mutators."
+ "The function returns an error in case of a failure state. "
+ "In case of retry state, this function returns a bool value of true and "
+ "nil error, while in case of success it returns a bool value of false and "
+ "nil error."
);
writer.write(
"Retryable func(context.Context, $P, $P, error) "
+ "(bool, error)", inputSymbol, outputSymbol);
}
);
writer.write("");
}