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