in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/HttpBindingProtocolGenerator.java [1189:1321]
private String generateHttpHeaderValue(
GenerationContext context,
GoWriter writer,
MemberShape memberShape,
HttpBinding binding,
String operand
) {
Shape targetShape = context.getModel().expectShape(memberShape.getTarget());
if (targetShape.getType() != ShapeType.LIST && targetShape.getType() != ShapeType.SET) {
writer.addUseImports(SmithyGoDependency.STRINGS);
writer.write("$L = strings.TrimSpace($L)", operand, operand);
}
String value = "";
switch (targetShape.getType()) {
case STRING:
if (targetShape.hasTrait(EnumTrait.class)) {
value = String.format("types.%s(%s)", targetShape.getId().getName(), operand);
return value;
}
// MediaType strings must be base-64 encoded when sent in headers.
if (targetShape.hasTrait(MediaTypeTrait.class)) {
writer.addUseImports(SmithyGoDependency.BASE64);
writer.write("b, err := base64.StdEncoding.DecodeString($L)", operand);
writer.write("if err != nil { return err }");
return "string(b)";
}
return operand;
case ENUM:
value = String.format("types.%s(%s)", targetShape.getId().getName(), operand);
return value;
case BOOLEAN:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseBool($L)", operand);
writer.write("if err != nil { return err }");
return "vv";
case TIMESTAMP:
writer.addUseImports(SmithyGoDependency.SMITHY_TIME);
HttpBindingIndex bindingIndex = context.getModel().getKnowledge(HttpBindingIndex.class);
TimestampFormatTrait.Format format = bindingIndex.determineTimestampFormat(
memberShape,
binding.getLocation(),
Format.HTTP_DATE
);
switch (format) {
case EPOCH_SECONDS:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("f, err := strconv.ParseFloat($L, 64)", operand);
writer.write("if err != nil { return err }");
writer.write("t := smithytime.ParseEpochSeconds(f)");
break;
case HTTP_DATE:
writer.write("t, err := smithytime.ParseHTTPDate($L)", operand);
writer.write("if err != nil { return err }");
break;
case DATE_TIME:
writer.write("t, err := smithytime.ParseDateTime($L)", operand);
writer.write("if err != nil { return err }");
break;
default:
throw new CodegenException("Unexpected timestamp format " + format);
}
return "t";
case BYTE:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseInt($L, 0, 8)", operand);
writer.write("if err != nil { return err }");
return "int8(vv)";
case SHORT:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseInt($L, 0, 16)", operand);
writer.write("if err != nil { return err }");
return "int16(vv)";
case INTEGER:
case INT_ENUM:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseInt($L, 0, 32)", operand);
writer.write("if err != nil { return err }");
return "int32(vv)";
case LONG:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseInt($L, 0, 64)", operand);
writer.write("if err != nil { return err }");
return "vv";
case FLOAT:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseFloat($L, 32)", operand);
writer.write("if err != nil { return err }");
return "float32(vv)";
case DOUBLE:
writer.addUseImports(SmithyGoDependency.STRCONV);
writer.write("vv, err := strconv.ParseFloat($L, 64)", operand);
writer.write("if err != nil { return err }");
return "vv";
case BIG_INTEGER:
writer.addUseImports(SmithyGoDependency.BIG);
writer.write("i := big.NewInt(0)");
writer.write("bi, ok := i.SetString($L,0)", operand);
writer.openBlock("if !ok {", "}", () -> {
writer.write(
"return fmt.Error($S)",
"Incorrect conversion from string to BigInteger type"
);
});
return "*bi";
case BIG_DECIMAL:
writer.addUseImports(SmithyGoDependency.BIG);
writer.write("f := big.NewFloat(0)");
writer.write("bd, ok := f.SetString($L,0)", operand);
writer.openBlock("if !ok {", "}", () -> {
writer.write(
"return fmt.Error($S)",
"Incorrect conversion from string to BigDecimal type"
);
});
return "*bd";
case BLOB:
writer.addUseImports(SmithyGoDependency.BASE64);
writer.write("b, err := base64.StdEncoding.DecodeString($L)", operand);
writer.write("if err != nil { return err }");
return "b";
case SET:
case LIST:
// handle list/Set as target shape
MemberShape targetValueListMemberShape = CodegenUtils.expectCollectionShape(targetShape).getMember();
return getHttpHeaderCollectionDeserializer(context, writer, targetValueListMemberShape,
binding,
operand);
default:
throw new CodegenException("unexpected shape type " + targetShape.getType());
}
}