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 09166bd1ed Some progress for S7 case
09166bd1ed is described below

commit 09166bd1eda9ac3062cc3950a09c6587bc2ca706
Author: julian <[email protected]>
AuthorDate: Sun Jun 5 22:48:41 2022 +0200

    Some progress for S7 case
---
 .../language/rust/RustLanguageTemplateHelper.java  | 24 ++++++++++++++++++----
 .../templates/rust/complex-type-template.rs.ftlh   | 20 +++++++++++++++---
 2 files changed, 37 insertions(+), 7 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 0fbb1bdc54..76fb4a98c4 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
@@ -361,11 +361,21 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
     }
 
     public String getReadFunctionCall(TypeReference typeReference) {
-        if (!(typeReference instanceof SimpleTypeReference)) {
-            throw new RuntimeException("Not implemented yet: " + 
typeReference);
+        SimpleTypeReference simpleTypeReference;
+        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?!");
+            }
+        } else {
+            throw new RuntimeException("Not implemented yet!");
         }
-        SimpleTypeReference simpleTypeReference = (SimpleTypeReference) 
typeReference;
-        switch (simpleTypeReference.getBaseType()) {
+        SimpleTypeReference.SimpleBaseType baseType;
+        baseType = simpleTypeReference.getBaseType();
+        switch (baseType) {
             case BIT:
                 return "read_bit()?";
             case UINT:
@@ -376,6 +386,12 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
                 if (unsignedIntegerTypeReference.getSizeInBits() == 8) {
                     return "read_u8()?";
                 }
+                if (unsignedIntegerTypeReference.getSizeInBits() < 16) {
+                    return "read_u_n(" + 
unsignedIntegerTypeReference.getSizeInBits() + ")? as u16";
+                }
+                if (unsignedIntegerTypeReference.getSizeInBits() == 16) {
+                    return "read_u16()?";
+                }
         }
         throw new RuntimeException("Not implemented yet: " + typeReference);
     }
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 bda8b5dfc6..08bfbf5551 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
@@ -65,17 +65,21 @@ use crate::<#list import as 
path>${path}<#sep>::</#sep></#list>;
 #[derive(PartialEq, Debug, Clone)]
 pub struct ${type.name}Options {
 <#if type.parserArguments?? && !type.parserArguments.isEmpty()>
-<#list type.parserArguments.orElseThrow() as arg>
+<#if type.parserArguments.isPresent()>
+<#list type.parserArguments.get() as arg>
     pub ${arg.name}: 
${helper.getLanguageTypeNameForTypeReference(arg.type)}<#sep>, </#sep>
 </#list>
 </#if>
+</#if>
 <#if !type.parentType.isEmpty()>
 <#if type.parentType.get().parserArguments?? && 
!type.parentType.get().parserArguments.isEmpty()>
-<#list type.parentType.get().parserArguments.orElseThrow() as arg>
+<#if type.parentType.get().parserArguments.isPresent()>
+<#list type.parentType.get().parserArguments.get() as arg>
     pub ${arg.name}: 
${helper.getLanguageTypeNameForTypeReference(arg.type)}<#sep>, </#sep>
 </#list>
 </#if>
 </#if>
+</#if>
 }
 <#--</#if>-->
 <#if helper.isAbstract(type)>
@@ -107,9 +111,11 @@ impl Message for ${type.name} {
     fn parse<T: Read>(reader: &mut ReadBuffer<T>, parameter: Option<Self::P>) 
-> Result<Self::M, Error> {
         // (Re-)define the options
         let parameter = parameter.unwrap();
-    <#list type.parserArguments.orElseThrow() as arg>
+    <#if type.parserArguments.isPresent()>
+    <#list type.parserArguments.get() as arg>
         let ${arg.name} = parameter.${arg.name};
     </#list>
+    </#if>
     <#list type.fields as field>
         <#if helper.isSwitchField(field)>
         match (<#list field.getDiscriminatorExpressions() as 
literal>${literal.name}<#sep>, </#sep></#list>) {
@@ -132,7 +138,11 @@ impl Message for ${type.name} {
             }
         }
         <#else>
+        <#if field.isSimpleField()>
         let ${field.name} = reader.${helper.getReadFunctionCall(field.type)};
+        <#else>
+            -> ${field}
+        </#if>
         </#if>
 <#--        ${helper.generateFieldParseCode(field)}-->
     </#list>
@@ -142,7 +152,11 @@ impl Message for ${type.name} {
 #[derive(PartialEq, Debug, Clone)]
 pub struct ${type.name} {
     <#list type.fields as field>
+    <#if field.isSimpleField()>
     pub ${field.name}: 
${helper.getLanguageTypeNameForTypeReference(field.type)}<#sep>,</#sep>
+    <#else>
+        -> ${field}
+    </#if>
     </#list>
 }
 

Reply via email to