From 4597388e4b771585f7be32d9f0995bdbedf04c11 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 20 Mar 2026 19:27:37 +0000 Subject: Add initial skeleton for Protobuf serialisation --- .../compiler/patio/protobuf/PatioToProtobuf.java | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java new file mode 100644 index 00000000..c95e924a --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -0,0 +1,83 @@ +package org.shedlang.compiler.patio.protobuf; + +import org.shedlang.compiler.patio.*; + +public class PatioToProtobuf { + public PatioProtobuf.PatioCompilationUnit compilationUnitToProtobuf( + PatioCompilationUnit compilationUnit + ) { + var builder = PatioProtobuf.PatioCompilationUnit.newBuilder(); + for (var element : compilationUnit.elements()) { + builder.addElements(compilationUnitElementToProtobuf(element)); + } + return builder.build(); + } + + private PatioProtobuf.PatioCompilationUnitElement compilationUnitElementToProtobuf( + PatioCompilationUnitElement element + ) { + var builder = PatioProtobuf.PatioCompilationUnitElement.newBuilder(); + + switch (element) { + case PatioDataElementImmutableDefinition dataElementImmutableDefinition -> { + builder.setDataElementImmutableDefinition( + dataElementImmutableDefinitionToProtobuf(dataElementImmutableDefinition) + ); + } + case PatioDataElementMutableDeclaration dataElementMutableDeclaration -> { + builder.setDataElementMutableDeclaration( + dataElementMutableDeclarationToProtobuf(dataElementMutableDeclaration) + ); + } + case PatioDataElementMutableDefinition dataElementMutableDefinition -> { + builder.setDataElementMutableDefinition( + dataElementMutableDefinitionToProtobuf(dataElementMutableDefinition) + ); + } + case PatioExceptionTypeDefinition exceptionTypeDefinition -> { + throw new UnsupportedOperationException("TODO"); + } + case PatioFunctionDeclaration functionDeclaration -> { + throw new UnsupportedOperationException("TODO"); + } + case PatioFunctionDefinition functionDefinition -> { + throw new UnsupportedOperationException("TODO"); + } + } + + return builder.build(); + } + + private PatioProtobuf.PatioDataElementImmutableDefinition dataElementImmutableDefinitionToProtobuf( + PatioDataElementImmutableDefinition element + ) { + var builder = PatioProtobuf.PatioDataElementImmutableDefinition.newBuilder(); + builder.setName(element.name()); + builder.setVisibility(visibilityToProtobuf(element.visibility())); + return builder.build(); + } + + private PatioProtobuf.PatioDataElementMutableDeclaration dataElementMutableDeclarationToProtobuf( + PatioDataElementMutableDeclaration element + ) { + var builder = PatioProtobuf.PatioDataElementMutableDeclaration.newBuilder(); + builder.setName(element.name()); + return builder.build(); + } + + private PatioProtobuf.PatioDataElementMutableDefinition dataElementMutableDefinitionToProtobuf( + PatioDataElementMutableDefinition element + ) { + var builder = PatioProtobuf.PatioDataElementMutableDefinition.newBuilder(); + builder.setName(element.name()); + builder.setVisibility(visibilityToProtobuf(element.visibility())); + return builder.build(); + } + + private PatioProtobuf.PatioVisibility visibilityToProtobuf(PatioVisibility visibility) { + return switch (visibility) { + case PRIVATE -> PatioProtobuf.PatioVisibility.PRIVATE; + case PUBLIC -> PatioProtobuf.PatioVisibility.PUBLIC; + }; + } +} -- cgit v1.2.3