This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch feature/plc4rs
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/plc4rs by this push:
     new f831eb43c9 Now most fields work besides computed ones and constants
f831eb43c9 is described below

commit f831eb43c981dec4e74c01556fc7e19dde6319e2
Author: julian <[email protected]>
AuthorDate: Mon Jun 6 11:41:23 2022 +0200

    Now most fields work besides computed ones and constants
---
 .../language/rust/RustLanguageTemplateHelper.java  | 37 ++++++++++++----------
 .../templates/rust/complex-type-template.rs.ftlh   |  2 +-
 plc4rust/src/write_buffer.rs                       |  7 ++++
 3 files changed, 28 insertions(+), 18 deletions(-)

diff --git 
a/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/RustLanguageTemplateHelper.java
 
b/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/RustLanguageTemplateHelper.java
index 03426a41ed..b0fa81f165 100644
--- 
a/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/RustLanguageTemplateHelper.java
+++ 
b/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/RustLanguageTemplateHelper.java
@@ -24,6 +24,7 @@ import org.apache.commons.text.WordUtils;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultComplexTypeDefinition;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultEnumTypeDefinition;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.DefaultDiscriminatorField;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.DefaultImplicitField;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.DefaultSwitchField;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.DefaultTypedNamedField;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultArrayTypeReference;
@@ -367,20 +368,22 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
     public String getWriteFunctionCall(DefaultTypedNamedField field) {
         TypeReference typeReference = field.getType();
         SimpleTypeReference simpleTypeReference;
+        String fieldName = field.getName();
         if (typeReference instanceof SimpleTypeReference) {
             simpleTypeReference = (SimpleTypeReference) typeReference;
         } else if (typeReference instanceof DefaultEnumTypeReference) {
-            if (((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().isPresent()) {
-                simpleTypeReference = ((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().get();
-            } else {
-                throw new RuntimeException("No idea whats happening here?!");
-            }
+            return "self." + fieldName + ".serialize(writer)?";
+//            if (((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().isPresent()) {
+//                simpleTypeReference = ((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().get();
+//            } else {
+//                throw new RuntimeException("No idea whats happening here?!");
+//            }
         } else if (typeReference instanceof DefaultArrayTypeReference) {
             // Get length
             TypeReference elementTypeReference = ((DefaultArrayTypeReference) 
typeReference).getElementTypeReference();
             if (elementTypeReference instanceof SimpleTypeReference) {
                 if (((SimpleTypeReference) elementTypeReference).getBaseType() 
== SimpleTypeReference.SimpleBaseType.BYTE) {
-                    return "writer.write_bytes(self." + field.getName() + 
".as_slice())?";
+                    return "writer.write_bytes(self." + fieldName + 
".as_slice())?";
                 }
             } else if (elementTypeReference instanceof ComplexTypeReference) {
                 return "// not handled yet";
@@ -393,29 +396,33 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
             // Get Options
             List<Argument> parserArguments = ((ComplexTypeReference) 
typeReference).getTypeDefinition().getParserArguments().orElse(Collections.emptyList());
             String options = parserArguments.stream().map(argument -> 
argument.getName()).collect(Collectors.joining(","));
-            return "self." + field.getName() + ".serialize(writer)?";
+            return "self." + fieldName + ".serialize(writer)?";
         } else {
             return "// not handled yet";
 //            throw new RuntimeException("Not implemented yet: " + 
typeReference);
         }
         SimpleTypeReference.SimpleBaseType baseType;
         baseType = simpleTypeReference.getBaseType();
+        String argument = fieldName;
+        if (field instanceof DefaultImplicitField) {
+            argument = argument + "()";
+        }
         switch (baseType) {
             case BIT:
-                return "writer.write_bit(self." + field.getName() + ")?";
+                return String.format("writer.write_bit(self.%s)?", argument);
             case UINT:
                 IntegerTypeReference unsignedIntegerTypeReference = 
(IntegerTypeReference) simpleTypeReference;
                 if (unsignedIntegerTypeReference.getSizeInBits() < 8) {
-                    return "writer.write_u_n(self." + 
unsignedIntegerTypeReference.getSizeInBits() + ", self." + field.getName() + " 
as u64)? as u8";
+                    return "writer.write_u_n(self." + 
unsignedIntegerTypeReference.getSizeInBits() + ", self." + argument + " as 
u64)? as u8";
                 }
                 if (unsignedIntegerTypeReference.getSizeInBits() == 8) {
-                    return "writer.write_u8(self." + field.getName() + ")?";
+                    return "writer.write_u8(self." + argument + ")?";
                 }
                 if (unsignedIntegerTypeReference.getSizeInBits() < 16) {
-                    return "writer.write_u_n(self." + 
unsignedIntegerTypeReference.getSizeInBits() + ", self." + field.getName() + " 
as u64)? as u16";
+                    return "writer.write_u_n(self." + 
unsignedIntegerTypeReference.getSizeInBits() + ", self." + argument + " as 
u64)? as u16";
                 }
                 if (unsignedIntegerTypeReference.getSizeInBits() == 16) {
-                    return "writer.write_u16(self." + field.getName() + ")?";
+                    return "writer.write_u16(self." + argument + ")?";
                 }
         }
         throw new RuntimeException("Not implemented yet: " + typeReference);
@@ -426,11 +433,7 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
         if (typeReference instanceof SimpleTypeReference) {
             simpleTypeReference = (SimpleTypeReference) typeReference;
         } else if (typeReference instanceof DefaultEnumTypeReference) {
-            if (((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().isPresent()) {
-                simpleTypeReference = ((DefaultEnumTypeReference) 
typeReference).getBaseTypeReference().get();
-            } else {
-                throw new RuntimeException("No idea whats happening here?!");
-            }
+            return ((DefaultEnumTypeReference) 
typeReference).getTypeDefinition().getName() + "::parse(reader, None)?";
         } else if (typeReference instanceof DefaultArrayTypeReference) {
             // Get length
             TypeReference elementTypeReference = ((DefaultArrayTypeReference) 
typeReference).getElementTypeReference();
diff --git 
a/code-generation/language-rust/src/main/resources/templates/rust/complex-type-template.rs.ftlh
 
b/code-generation/language-rust/src/main/resources/templates/rust/complex-type-template.rs.ftlh
index b5a480c427..d4fd32c6ae 100644
--- 
a/code-generation/language-rust/src/main/resources/templates/rust/complex-type-template.rs.ftlh
+++ 
b/code-generation/language-rust/src/main/resources/templates/rust/complex-type-template.rs.ftlh
@@ -169,7 +169,7 @@ pub struct ${type.name} {
 impl ${type.name} {
     <#list type.fields as field>
     <#if field.isImplicitField()>
-    pub fn ${field.name}(&mut self) -> 
${helper.getLanguageTypeNameForTypeReference(field.type)} {
+    pub fn ${field.name}(&self) -> 
${helper.getLanguageTypeNameForTypeReference(field.type)} {
         0
     }
     </#if>
diff --git a/plc4rust/src/write_buffer.rs b/plc4rust/src/write_buffer.rs
index 7dd32f3edb..175acf674a 100644
--- a/plc4rust/src/write_buffer.rs
+++ b/plc4rust/src/write_buffer.rs
@@ -114,6 +114,13 @@ impl<T: Write> WriteBuffer<T> {
         Ok(bytes_written)
     }
 
+    pub fn write_bit(&mut self, value: bool) -> std::io::Result<usize> {
+        if value {
+            self.write_u_n(1, 1)
+        } else {
+            self.write_u_n(1, 0)
+        }
+    }
     pub fn write_u_n(&mut self, num_bits: u8, value: u64) -> 
std::io::Result<usize> {
         self.bit_writer.write(value, num_bits, &mut self.writer)
     }

Reply via email to