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>
}
}