GeneratorContext.java
package de.schegge.rosinante.generator;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
public class GeneratorContext {
private static final Map<String, FieldType> TYPES = Map.ofEntries(
Map.entry("string", new SimpleFieldType("String", "String", "String", "\"\"", 0, false)),
Map.entry("bytes", new SimpleFieldType("byte[]", "byte[]", "Bytes", "new byte[0]", 0, false)),
Map.entry("bool", new SimpleFieldType("boolean", "Boolean", "Boolean", "false")),
Map.entry("int32", new SimpleFieldType("int", "Integer", "Integer", "0")),
Map.entry("int64", new SimpleFieldType("long", "Long", "Long", "0L")),
Map.entry("uint32", new SimpleFieldType("int", "Integer", "Integer", "0")),
Map.entry("uint64", new SimpleFieldType("long", "Long", "Long", "0L")),
Map.entry("sint32", new SimpleFieldType("int", "Integer", "ZigZagInteger", "0")),
Map.entry("sint64", new SimpleFieldType("long", "Long", "ZigZagLong", "0L")),
Map.entry("double", new SimpleFieldType("double", "Double", "Double", "0.0")),
Map.entry("float", new SimpleFieldType("float", "Float", "Float", "0.0f")),
Map.entry("fixed32", new SimpleFieldType("int", "Integer", "Fixed32", "0")),
Map.entry("fixed64", new SimpleFieldType("long", "Long", "Fixed64", "0L")),
Map.entry("sfixed32", new SimpleFieldType("int", "Integer", "SFixed32", "0")),
Map.entry("sfixed64", new SimpleFieldType("long", "Long", "SFixed64", "0L"))
);
private String packageName;
private final List<MessagePattern> messages = new ArrayList<>();
private final List<EnumPattern> enums = new ArrayList<>();
private final Set<String> types = new HashSet<>();
public void setPackageName(String packageName) {
this.packageName = Objects.requireNonNull(packageName);
}
public String getPackageName() {
return packageName;
}
public void addMessage(MessagePattern messagePattern) {
if (types.contains(messagePattern.getName())) {
throw new IllegalArgumentException("duplicate name: " + messagePattern.getName());
}
messages.add(messagePattern);
}
public void addEnum(EnumPattern enumPattern) {
if (types.contains(enumPattern.getName())) {
throw new IllegalArgumentException("duplicate name: " + enumPattern.getName());
}
enums.add(enumPattern);
}
public Stream<MessagePattern> getMessages() {
return messages.stream();
}
public Stream<EnumPattern> getEnums() {
return enums.stream();
}
public FieldType getType(String typeName) {
FieldType type = TYPES.get(typeName);
if (type != null) {
return type;
}
if (getMessages().anyMatch(m -> typeName.equals(m.getName()))) {
return new SimpleFieldType(typeName, typeName, null, "null", 1, false);
} else if (getEnums().anyMatch(m -> typeName.equals(m.getName()))) {
return new SimpleFieldType(typeName, typeName, null, "null", 2, false);
}
throw new IllegalArgumentException("no type found: " + typeName);
}
}