aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 11:25:08 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 11:25:08 +0000
commit4ebb6355bd2481e844d07a649dce3daa2b9fa881 (patch)
tree9fda5411800a34f51befe3c0447fe00cf29940cf /src/main/java/org
parent31a0498b5479163e399ba76b1ca8dee15e7a3bbe (diff)
Serialize Patio data layouts to Protobuf
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java94
1 files changed, 90 insertions, 4 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
index 07b652d8..58157c86 100644
--- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java
+++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java
@@ -1,10 +1,11 @@
package org.shedlang.compiler.patio.protobuf;
import org.shedlang.compiler.patio.*;
+import org.shedlang.compiler.patio.types.*;
import org.shedlang.compiler.sources.Source;
-import org.shedlang.compiler.sources.protobuf.SourceToProtobuf;
import java.util.Optional;
+import java.util.stream.Collectors;
import static org.shedlang.compiler.sources.protobuf.SourceToProtobuf.serializeSource;
@@ -68,7 +69,7 @@ public class PatioToProtobuf {
Source parentSource
) {
var builder = PatioProtobuf.PatioDataElementImmutableDefinition.newBuilder();
- builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource));
+ builder.setSource(serializeSource(element.source(), parentSource));
builder.setName(element.name());
builder.setVisibility(serializeVisibility(element.visibility()));
return builder.build();
@@ -79,7 +80,7 @@ public class PatioToProtobuf {
Source parentSource
) {
var builder = PatioProtobuf.PatioDataElementMutableDeclaration.newBuilder();
- builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource));
+ builder.setSource(serializeSource(element.source(), parentSource));
builder.setName(element.name());
return builder.build();
}
@@ -89,7 +90,7 @@ public class PatioToProtobuf {
Source parentSource
) {
var builder = PatioProtobuf.PatioDataElementMutableDefinition.newBuilder();
- builder.setSource(SourceToProtobuf.serializeSource(element.source(), parentSource));
+ builder.setSource(serializeSource(element.source(), parentSource));
builder.setName(element.name());
builder.setVisibility(serializeVisibility(element.visibility()));
return builder.build();
@@ -101,4 +102,89 @@ public class PatioToProtobuf {
case PUBLIC -> PatioProtobuf.PatioVisibility.PUBLIC;
};
}
+
+ public static PatioProtobuf.PatioDataLayout serializeDataLayout(PatioDataLayout layout) {
+ var builder = PatioProtobuf.PatioDataLayout.newBuilder();
+ switch (layout) {
+ case PatioDataLayoutArray patioDataLayoutArray -> {
+ var arrayBuilder = PatioProtobuf.PatioDataLayoutArray.newBuilder();
+ arrayBuilder.setElement(serializeDataLayout(patioDataLayoutArray.element()));
+ arrayBuilder.setSize(patioDataLayoutArray.size());
+ builder.setArray(arrayBuilder);
+ }
+
+ case PatioDataLayoutBool patioDataLayoutBool -> {
+ builder.setBool(PatioProtobuf.PatioDataLayoutBool.newBuilder().build());
+ }
+
+ case PatioDataLayoutByte patioDataLayoutByte -> {
+ builder.setByte(PatioProtobuf.PatioDataLayoutByte.newBuilder().build());
+ }
+
+ case PatioDataLayoutDataPtr patioDataLayoutDataPtr -> {
+ builder.setDataPtr(PatioProtobuf.PatioDataLayoutDataPtr.newBuilder().build());
+ }
+
+ case PatioDataLayoutFunctionPtr patioDataLayoutFunctionPtr -> {
+ builder.setFunctionPtr(PatioProtobuf.PatioDataLayoutFunctionPtr.newBuilder().build());
+ }
+
+ case PatioDataLayoutInt patioDataLayoutInt -> {
+ builder.setInt(PatioProtobuf.PatioDataLayoutInt.newBuilder().build());
+ }
+
+ case PatioDataLayoutInt32 patioDataLayoutInt32 -> {
+ builder.setInt32(PatioProtobuf.PatioDataLayoutInt32.newBuilder().build());
+ }
+
+ case PatioDataLayoutStruct patioDataLayoutStruct -> {
+ var structBuilder = PatioProtobuf.PatioDataLayoutStruct.newBuilder();
+ for (var element : patioDataLayoutStruct.elements()) {
+ structBuilder.addElements(serializeDataLayout(element));
+ }
+ builder.setStruct(structBuilder);
+ }
+ }
+
+ return builder.build();
+ }
+
+ public static PatioDataLayout deserializeDataLayout(PatioProtobuf.PatioDataLayout layoutProtobuf) {
+ return switch (layoutProtobuf.getValueCase()) {
+ case ARRAY ->
+ PatioDataLayouts.array(
+ deserializeDataLayout(layoutProtobuf.getArray().getElement()),
+ layoutProtobuf.getArray().getSize()
+ );
+
+ case BOOL ->
+ PatioDataLayouts.BOOL;
+
+ case BYTE ->
+ PatioDataLayouts.BYTE;
+
+ case DATA_PTR ->
+ PatioDataLayouts.DATA_PTR;
+
+ case FUNCTION_PTR ->
+ PatioDataLayouts.FUNCTION_PTR;
+
+ case INT ->
+ PatioDataLayouts.INT;
+
+ case INT32 ->
+ PatioDataLayouts.INT32;
+
+ case STRUCT ->
+ PatioDataLayouts.struct(
+ layoutProtobuf.getStruct().getElementsList().stream()
+ .map(PatioToProtobuf::deserializeDataLayout)
+ .collect(Collectors.toList())
+ );
+
+ case VALUE_NOT_SET -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+ };
+ }
}