aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-20 19:27:37 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 10:28:51 +0000
commit4597388e4b771585f7be32d9f0995bdbedf04c11 (patch)
tree75f34b722dbd325a2b7784016c43c3e520b2e0d0 /src/main/java
parent826c6108e2b88196813ff27903ab7645b9a9ebc0 (diff)
Add initial skeleton for Protobuf serialisation
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java83
1 files changed, 83 insertions, 0 deletions
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;
+ };
+ }
+}