use of com.palantir.conjure.spec.UnionDefinition in project conjure-java by palantir.
the class UnionGenerator method generateUnionType.
public static JavaFile generateUnionType(TypeMapper typeMapper, Map<com.palantir.conjure.spec.TypeName, TypeDefinition> typesMap, UnionDefinition typeDef, Options options) {
com.palantir.conjure.spec.TypeName prefixedTypeName = Packages.getPrefixedName(typeDef.getTypeName(), options.packagePrefix());
ClassName unionClass = ClassName.get(prefixedTypeName.getPackage(), prefixedTypeName.getName());
ClassName baseClass = unionClass.nestedClass("Base");
ClassName visitorClass = unionClass.nestedClass("Visitor");
ClassName visitorBuilderClass = unionClass.nestedClass("VisitorBuilder");
Map<FieldDefinition, TypeName> memberTypes = typeDef.getUnion().stream().collect(StableCollectors.toLinkedMap(Function.identity(), entry -> typeMapper.getClassName(entry.getType())));
List<FieldSpec> fields = ImmutableList.of(FieldSpec.builder(baseClass, VALUE_FIELD_NAME, Modifier.PRIVATE, Modifier.FINAL).build());
TypeSpec.Builder typeBuilder = TypeSpec.classBuilder(typeDef.getTypeName().getName()).addAnnotation(ConjureAnnotations.getConjureGeneratedAnnotation(UnionGenerator.class)).addModifiers(Modifier.PUBLIC, Modifier.FINAL).addFields(fields).addMethod(generateConstructor(baseClass)).addMethod(generateGetValue(baseClass)).addMethods(generateStaticFactories(typeMapper, unionClass, typeDef.getUnion())).addMethod(generateAcceptVisitMethod(visitorClass)).addType(generateVisitor(unionClass, visitorClass, memberTypes, visitorBuilderClass, options)).addType(generateVisitorBuilder(unionClass, visitorClass, visitorBuilderClass, memberTypes, options)).addTypes(generateVisitorBuilderStageInterfaces(unionClass, visitorClass, memberTypes, options)).addType(generateBase(baseClass, visitorClass, memberTypes)).addTypes(generateWrapperClasses(typeMapper, typesMap, baseClass, visitorClass, typeDef.getUnion(), options)).addType(generateUnknownWrapper(baseClass, visitorClass, options)).addMethod(generateEquals(unionClass)).addMethod(MethodSpecs.createEqualTo(unionClass, fields)).addMethod(MethodSpecs.createHashCode(fields)).addMethod(MethodSpecs.createToString(unionClass.simpleName(), fields.stream().map(fieldSpec -> FieldName.of(fieldSpec.name)).collect(Collectors.toList())));
typeDef.getDocs().ifPresent(docs -> typeBuilder.addJavadoc("$L", Javadoc.render(docs)));
return JavaFile.builder(prefixedTypeName.getPackage(), typeBuilder.build()).skipJavaLangImports(true).indent(" ").build();
}
use of com.palantir.conjure.spec.UnionDefinition in project conjure-postman by palantir.
the class TemplateTypeVisitor method visitReference.
@SuppressWarnings("PreferSafeLoggingPreconditions")
@Override
public JsonNode visitReference(TypeName value) {
TypeDefinition definition = types.get(value);
TemplateTypeVisitor visitor = this;
return definition.accept(new TypeDefinition.Visitor<JsonNode>() {
@Override
public JsonNode visitAlias(AliasDefinition value) {
JsonNode wrapped = value.getAlias().accept(visitor);
if (wrapped instanceof TextNode) {
return new TextNode(String.format("{{ %s(%s) }}", value.getTypeName().getName(), wrapped.toString().replaceAll("[\"{}]", "")));
}
return wrapped;
}
@Override
public JsonNode visitEnum(EnumDefinition value) {
return new TextNode(value.getValues().stream().map(EnumValueDefinition::getValue).collect(Collectors.joining("|")));
}
@Override
public JsonNode visitObject(ObjectDefinition value) {
if (seenTypeStack.contains(value.getTypeName())) {
return new TextNode(String.format("{{%s}}", value.getTypeName().getName()));
}
seenTypeStack.push(value.getTypeName());
ObjectNode node = objectMapper.createObjectNode();
value.getFields().forEach(fieldDefinition -> node.set(fieldDefinition.getFieldName().get(), fieldDefinition.getType().accept(visitor)));
Preconditions.checkState(seenTypeStack.pop().equals(value.getTypeName()));
return node;
}
@Override
public JsonNode visitUnion(UnionDefinition value) {
if (value.getUnion().isEmpty()) {
return null;
} else {
if (seenTypeStack.contains(value.getTypeName())) {
return new TextNode(String.format("{{%s}}", value.getTypeName().getName()));
}
seenTypeStack.push(value.getTypeName());
String unionTypes = value.getUnion().stream().map(FieldDefinition::getFieldName).map(FieldName::get).collect(Collectors.joining("|"));
ObjectNode templates = objectMapper.createObjectNode();
value.getUnion().forEach(field -> templates.set(field.getFieldName().get(), field.getType().accept(visitor)));
JsonNode union = objectMapper.createObjectNode().put("type", unionTypes).set("oneOf", templates);
Preconditions.checkState(seenTypeStack.pop().equals(value.getTypeName()));
return union;
}
}
@Override
public JsonNode visitUnknown(String _unknownType) {
return new TextNode("{{UNKNOWN}}");
}
});
}
use of com.palantir.conjure.spec.UnionDefinition in project conjure-postman by palantir.
the class TypeNameFormatterVisitor method visitReference.
@Override
public String visitReference(TypeName value) {
TypeDefinition definition = types.get(value);
TypeNameFormatterVisitor visitor = this;
return definition.accept(new TypeDefinition.Visitor<String>() {
@Override
public String visitAlias(AliasDefinition value) {
return String.format("%s(%s)", value.getTypeName().getName(), value.getAlias().accept(visitor));
}
@Override
public String visitEnum(EnumDefinition value) {
return value.getTypeName().getName();
}
@Override
public String visitObject(ObjectDefinition value) {
return value.getTypeName().getName();
}
@Override
public String visitUnion(UnionDefinition value) {
return value.getTypeName().getName();
}
@Override
public String visitUnknown(String _unknownType) {
return "UNKNOWN";
}
});
}
use of com.palantir.conjure.spec.UnionDefinition in project conjure by palantir.
the class ConjureParserUtils method parseUnionType.
public static TypeDefinition parseUnionType(TypeName name, com.palantir.conjure.parser.types.complex.UnionTypeDefinition def, ConjureTypeParserVisitor.ReferenceTypeResolver typeResolver) {
UnionDefinition unionType = UnionDefinition.builder().typeName(name).union(parseField(def.union(), typeResolver)).docs(def.docs().map(Documentation::of)).build();
UnionDefinitionValidator.validateAll(unionType);
return TypeDefinition.union(unionType);
}
use of com.palantir.conjure.spec.UnionDefinition in project conjure by palantir.
the class DealiasingTypeVisitor method visitReference.
@Override
public Either<TypeDefinition, Type> visitReference(TypeName value) {
TypeDefinition typeDefinition = objects.get(value);
Preconditions.checkState(typeDefinition != null, "Referenced TypeDefinition not found in map of types for TypeName: %s", value);
return typeDefinition.accept(new TypeDefinition.Visitor<Either<TypeDefinition, Type>>() {
@Override
public Either<TypeDefinition, Type> visitAlias(AliasDefinition value) {
// Recursively visit target of alias
return value.getAlias().accept(DealiasingTypeVisitor.this);
}
@Override
public Either<TypeDefinition, Type> visitEnum(EnumDefinition value) {
return Either.left(TypeDefinition.enum_(value));
}
@Override
public Either<TypeDefinition, Type> visitObject(ObjectDefinition value) {
return Either.left(TypeDefinition.object(value));
}
@Override
public Either<TypeDefinition, Type> visitUnion(UnionDefinition value) {
return Either.left(TypeDefinition.union(value));
}
@Override
public Either<TypeDefinition, Type> visitUnknown(String unknownType) {
throw new IllegalStateException("Unsupported type: " + unknownType);
}
});
}
Aggregations