in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters2.java [104:202]
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("");
var apiOptionsDocs = autoDocTemplate("""
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.
Passing options here is functionally equivalent to passing values to this config's
ClientOptions field that extend the inner client's APIOptions directly.""");
Symbol stackSymbol = SymbolUtils.createPointableSymbolBuilder("Stack",
SmithyGoDependency.SMITHY_MIDDLEWARE)
.build();
writer.write(goTemplate("""
$W
APIOptions []func($P) error
""", apiOptionsDocs, stackSymbol));
var clientOptionsDocs = autoDocTemplate("""
Functional options to be passed to all operations invoked by this client.
Function values that modify the inner APIOptions are applied after the waiter config's own
APIOptions modifiers.""");
writer.write("");
writer.write(goTemplate("""
$W
ClientOptions []func(*$L)
""", clientOptionsDocs, ClientOptions.NAME));
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("");
}