final String propertyName = formatPropertyName(signalToken.name()); final Token blockLengthToken = Generators.findFirst("blockLength", tokens, 0); final Token numInGroupToken = Generators.findFirst("numInGroup", tokens, 0); final int blockLengthOffset = blockLengthToken.offset(); final String blockLengthType = golangTypeName(blockLengthToken.encoding().primitiveType()); final String blockLengthMarshalType = golangMarshalType(blockLengthToken.encoding().primitiveType()); final int numInGroupOffset = numInGroupToken.offset(); final String numInGroupType = golangTypeName(numInGroupToken.encoding().primitiveType()); final String numInGroupMarshalType = golangMarshalType(numInGroupToken.encoding().primitiveType()); numInGroupType, varName, toUpperFirstChar(signalToken.name()), blockLengthMarshalType, propertyName, "\t\t}\n", varName, toUpperFirstChar(signalToken.name()))); "\t\t}\n", varName, toUpperFirstChar(signalToken.name()), typeName, propertyName)); "\t}\n", varName, toUpperFirstChar(signalToken.name())));
private void generateComposite(final List<Token> tokens, final String namePrefix) throws IOException { final String compositeName = namePrefix + formatTypeName(tokens.get(0).applicableTypeName()); final StringBuilder sb = new StringBuilder(); try (Writer out = outputManager.createOutput(compositeName)) { imports = new TreeSet<>(); imports.add("io"); generateTypeDeclaration(sb, compositeName); generateTypeBodyComposite(sb, compositeName, tokens.subList(1, tokens.size() - 1)); generateEncodeDecode(sb, compositeName, tokens.subList(1, tokens.size() - 1), false, false); generateEncodedLength(sb, compositeName, tokens.get(0).encodedLength()); generateCompositePropertyElements(sb, compositeName, tokens.subList(1, tokens.size() - 1)); // The FileHeader needs to know which imports to add so // it's created last once that's known. out.append(generateFileHeader(ir.namespaces())); out.append(sb); } }
private void generateEnum(final List<Token> tokens) throws IOException final String enumName = formatTypeName(tokens.get(0).applicableTypeName()); sb, enumName, golangTypeName(tokens.get(0).encoding().primitiveType()), tokens.subList(1, tokens.size() - 1), enumToken);
final String propertyName = formatPropertyName(signalToken.name()); decode.append(generateDecodeOffset(gap, "")); final String golangTypeForLength = golangTypeName(tokens.get(2).encoding().primitiveType()); final String golangTypeForLengthMarshal = golangMarshalType(tokens.get(2).encoding().primitiveType()); final String golangTypeForData = golangTypeName(tokens.get(3).encoding().primitiveType());
final String propertyName = formatPropertyName(token.name()); final String propertyName = formatPropertyName(token.name()); final String propertyType = formatPropertyName(token.applicableTypeName()); int arrayLength = token.arrayLength(); .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append("[").append(arrayLength).append("]") .append(golangTypeName(token.encoding().primitiveType())).append("\n"); .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append((arrayLength > 1) ? ("[" + arrayLength + "]") : "") .append(golangTypeName(token.encoding().primitiveType())).append("\n");
final String propertyName = formatPropertyName(token.name()); final String propertyName = formatPropertyName(signalToken.name()); final int length = longest - propertyName.length() + 1; golangType = golangTypeName(encodingToken.encoding().primitiveType()); if (golangType == null) golangType = toUpperFirstChar(encodingToken.name()); sb.append(String.format( "\t%1$s%2$s[]%3$s%1$s\n", toUpperFirstChar(signalToken.name()), String.format(String.format("%%%ds", length), " "), typeName)); generateTypeDeclaration( nested, typeName + toUpperFirstChar(signalToken.name())); generateTypeBody( nested, typeName + toUpperFirstChar(signalToken.name()), tokens.subList(i + 1, tokens.size() - 1)); i += signalToken.componentTokenCount() - 1; sb.append(String.format( "\t%1$s%2$s[]%3$s\n", toUpperFirstChar(signalToken.name()), String.format(String.format("%%%ds", length), " "), golangTypeName(tokens.get(i + 3).encoding().primitiveType())));
final String castType = golangTypeName(type); switch (type)
private int generatePropertyEncodeDecode( final Token token, final String typeName, final StringBuilder encode, final StringBuilder decode, final int currentOffset) { final char varName = Character.toLowerCase(typeName.charAt(0)); final String propertyName = formatPropertyName(token.name()); final int gap = token.offset() - currentOffset; encode.append(generateEncodeOffset(gap, "")); decode.append(generateDecodeOffset(gap, "")); encode.append(String.format( "\tif err := %1$s.%2$s.Encode(_m, _w); err != nil {\n" + "\t\treturn err\n" + "\t}\n", varName, propertyName)); decode.append(String.format( "\tif %1$s.%2$sInActingVersion(actingVersion) {\n" + "\t\tif err := %1$s.%2$s.Decode(_m, _r, actingVersion); err != nil {\n" + "\t\t\treturn err\n" + "\t\t}\n" + "\t}\n", varName, propertyName)); return token.encodedLength() + gap; }
/** * Format a String as a type name. * * @param value to be formatted. * @return the string formatted as an exported type name. */ public static String formatTypeName(final String value) { return toUpperFirstChar(value); }
private void generateEnumEncodeDecode(final StringBuilder sb, final String enumName, final Token token) final String typeName = golangTypeName(token.encoding().primitiveType()); final String marshalType; marshalType = golangMarshalType(token.encoding().primitiveType());
final String propertyName = formatPropertyName(signalToken.name()); generateEncodePrimitive(encode, varName, formatPropertyName(signalToken.name()), signalToken); generateEncodeDecode( nested, typeName + toUpperFirstChar(signalToken.name()), tokens.subList(i + 5, tokens.size() - 1), false, true));
final String marshalType = golangMarshalType(primitiveType);
final String propertyName = formatPropertyName(signalToken.name()); decode.append(generateDecodeOffset(gap, "")); final String golangTypeForLength = golangTypeName(tokens.get(2).encoding().primitiveType()); final String golangTypeForLengthMarshal = golangMarshalType(tokens.get(2).encoding().primitiveType()); final String golangTypeForData = golangTypeName(tokens.get(3).encoding().primitiveType());
final String propertyName = formatPropertyName(token.name()); final String propertyName = formatPropertyName(signalToken.name()); final int length = longest - propertyName.length() + 1; golangType = golangTypeName(encodingToken.encoding().primitiveType()); if (golangType == null) golangType = toUpperFirstChar(encodingToken.name()); sb.append(String.format( "\t%1$s%2$s[]%3$s%1$s\n", toUpperFirstChar(signalToken.name()), String.format(String.format("%%%ds", length), " "), typeName)); generateTypeDeclaration( nested, typeName + toUpperFirstChar(signalToken.name())); generateTypeBody( nested, typeName + toUpperFirstChar(signalToken.name()), tokens.subList(i + 1, tokens.size() - 1)); i += signalToken.componentTokenCount() - 1; sb.append(String.format( "\t%1$s%2$s[]%3$s\n", toUpperFirstChar(signalToken.name()), String.format(String.format("%%%ds", length), " "), golangTypeName(tokens.get(i + 3).encoding().primitiveType())));
final String blockLengthType = golangTypeName(ir.headerStructure().blockLengthType());
private void generateCompositePropertyElements( final StringBuilder sb, final String containingTypeName, final List<Token> tokens) { for (int i = 0; i < tokens.size();) { final Token token = tokens.get(i); final String propertyName = formatPropertyName(token.name()); // Write {Min,Max,Null}Value if (token.signal() == Signal.ENCODING) { generateMinMaxNull(sb, containingTypeName, propertyName, token); generateCharacterEncoding(sb, containingTypeName, propertyName, token); } switch (token.signal()) { case ENCODING: case BEGIN_ENUM: case BEGIN_SET: case BEGIN_COMPOSITE: generateSinceActingDeprecated(sb, containingTypeName, propertyName, token); break; default: break; } i += tokens.get(i).componentTokenCount(); } }
/** * Format a String as a property name. * * @param value to be formatted. * @return the string formatted as a property name. */ public static String formatPropertyName(final String value) { String formattedValue = toUpperFirstChar(value); if (ValidationUtil.isGolangKeyword(formattedValue)) { final String keywordAppendToken = System.getProperty(SbeTool.KEYWORD_APPEND_TOKEN); if (null == keywordAppendToken) { throw new IllegalStateException( "Invalid property name='" + formattedValue + "' please correct the schema or consider setting system property: " + SbeTool.KEYWORD_APPEND_TOKEN); } formattedValue += keywordAppendToken; } return formattedValue; }
private void generateEnum(final List<Token> tokens) throws IOException final String enumName = formatTypeName(tokens.get(0).applicableTypeName()); sb, enumName, golangTypeName(tokens.get(0).encoding().primitiveType()), tokens.subList(1, tokens.size() - 1), enumToken);
private void generateEnumEncodeDecode(final StringBuilder sb, final String enumName, final Token token) final String typeName = golangTypeName(token.encoding().primitiveType()); final String marshalType; marshalType = golangMarshalType(token.encoding().primitiveType());
final String propertyName = formatPropertyName(token.name()); final String propertyName = formatPropertyName(token.name()); final String propertyType = formatPropertyName(token.applicableTypeName()); int arrayLength = token.arrayLength(); .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append("[").append(arrayLength).append("]") .append(golangTypeName(token.encoding().primitiveType())).append("\n"); .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append((arrayLength > 1) ? ("[" + arrayLength + "]") : "") .append(golangTypeName(token.encoding().primitiveType())).append("\n");