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