You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2022/06/05 14:58:37 UTC

[plc4x] branch feature/plc4rs updated: Further progress in complex types

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 9376039376 Further progress in complex types
9376039376 is described below

commit 937603937661ed7a2b5aa6abc3cbede9a2af6e24
Author: julian <j....@pragmaticminds.de>
AuthorDate: Sun Jun 5 16:57:59 2022 +0200

    Further progress in complex types
---
 .../language/rust/RustLanguageTemplateHelper.java  | 26 +++++++++++----
 .../templates/rust/complex-type-template.rs.ftlh   | 38 +++++++++++++++++++---
 2 files changed, 54 insertions(+), 10 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 a865744f8f..bafa9e6f55 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
@@ -51,7 +51,7 @@ import java.util.stream.Collectors;
 public class RustLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelper {
 
     private final Map<String, String> options;
-    private List<TypeReference> imports = new ArrayList<>();
+    private Map<String, TypeDefinition> definitions = new HashMap<>();
 
     public RustLanguageTemplateHelper(TypeDefinition thisType, String protocolName, String flavorName, Map<String, TypeDefinition> types,
                                       Map<String, String> options) {
@@ -59,6 +59,10 @@ public class RustLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
         this.options = options;
     }
 
+    public void register(TypeDefinition definition) {
+        this.definitions.put(definition.getName(), definition);
+    }
+
     public String packageName() {
         return packageName(protocolName, "java", flavorName);
     }
@@ -143,13 +147,9 @@ public class RustLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
                 String options  = "None";
 
                 sb.append("Ok(" + aCase.getParentType().get().getName() + "::" + aCase.getName() + "(" + aCase.getName() + "::parse::<T>(reader, " + options + ")?))");
-
-                // TODO add the action here...
-                System.out.println("Hallo");
-
                 sb.append("}\n");
             }
-
+            sb.append("_ => { panic!(\"Something went wrong...\"); }\n");
             sb.append("}\n");
             return sb.toString();
         }
@@ -225,6 +225,13 @@ public class RustLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
         return "";
     }
 
+    public String getFullyQualifiedName(Literal literal) {
+        if (literal instanceof DefaultVariableLiteral) {
+            return ((DefaultVariableLiteral) literal).getName();
+        }
+        return literal.stringRepresentation();
+    }
+
     private static boolean canParseInt(String i) {
         // Hex number
         if (i.startsWith("0x")) {
@@ -249,6 +256,13 @@ public class RustLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
         return innerValue;
     }
 
+    public String formatLiteral(TypeReference type, Literal literal) {
+        if (literal instanceof DefaultVariableLiteral) {
+            return this.formatLiteral(type, ((DefaultVariableLiteral) literal).getName());
+        }
+        return this.formatLiteral(type, literal.stringRepresentation());
+    }
+
     public String formatLiteral(TypeReference type, String literal) {
         if ("null".equals(literal)) {
             return "null";
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 10725b9e55..57913bb7de 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
@@ -55,13 +55,22 @@ use crate::${import}::${import};
 </#if>
 </#list>
 
-<#if helper.needsParserArguments(type)>
+<#--<#if helper.needsParserArguments(type)>-->
 pub struct ${type.name}Options {
+<#if type.parserArguments?? && !type.parserArguments.isEmpty()>
 <#list type.parserArguments.orElseThrow() as arg>
     ${arg.name}: ${helper.getLanguageTypeNameForTypeReference(arg.type)}<#sep>, </#sep>
 </#list>
-}
 </#if>
+<#if !type.parentType.isEmpty()>
+<#if type.parentType.get().parserArguments?? && !type.parentType.get().parserArguments.isEmpty()>
+<#list type.parentType.get().parserArguments.orElseThrow() as arg>
+    ${arg.name}: ${helper.getLanguageTypeNameForTypeReference(arg.type)}<#sep>, </#sep>
+</#list>
+</#if>
+</#if>
+}
+<#--</#if>-->
 <#if helper.isAbstract(type)>
 #[derive(PartialEq, Debug, Clone)]
 pub enum ${type.name} {
@@ -89,12 +98,33 @@ 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
+        // (Re-)define the options
     <#list type.parserArguments.orElseThrow() as arg>
         let ${arg.name} = parameter.unwrap().${arg.name};
     </#list>
     <#list type.fields as field>
-        ${helper.generateFieldParseCode(field)}
+        <#if helper.isSwitchField(field)>
+        match (<#list field.getDiscriminatorExpressions() as literal>${literal.name}<#sep>, </#sep></#list>) {
+        <#list field.cases as aCase>
+            <#assign n=aCase.discriminatorValueTerms?size - 1>
+            <#assign m=field.getDiscriminatorExpressions()?size - 1>
+<#--            ${helper.sink(n)}-->
+            (<#list 0..m as i><#if i <= n><#assign caseType=field.getDiscriminatorExpressions()[i]><#assign term=aCase.discriminatorValueTerms[i]>${helper.formatLiteral(caseType.typeReference, term)}<#else>_</#if><#sep>, </#sep></#list>) => {
+                Ok(${type.name}::${aCase.name}(${aCase.name}::parse::<T>(reader, Some(${aCase.name}Options {
+                <#if type.parserArguments?? && !type.parserArguments.isEmpty()>
+                <#list type.parserArguments.orElseThrow() as arg>
+                    ${arg.name}<#sep>, </#sep>
+                </#list>
+                </#if>
+                }))?))
+<#--                ${helper.sink(aCase)}-->
+            }
+        </#list>
+        }
+        <#else>
+        read ${field}
+        </#if>
+<#--        ${helper.generateFieldParseCode(field)}-->
     </#list>
     }
 }