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 d324f242f2 ARRAY_SIZE_xxx is now implemented corrrectly
d324f242f2 is described below

commit d324f242f29e67a63e94605c496c4442f4e63074
Author: julian <[email protected]>
AuthorDate: Mon Jun 6 21:22:44 2022 +0200

    ARRAY_SIZE_xxx is now implemented corrrectly
---
 .../plc4x/language/rust/ExpressionVisitor.java     | 103 +++++++++++++++++++++
 .../language/rust/RustLanguageTemplateHelper.java  |   8 ++
 .../templates/rust/complex-type-template.rs.ftlh   |   9 +-
 .../generated-sources/plc4x/src/ModbusConstants.rs |   1 -
 .../plc4x/src/ModbusDeviceInformationObject.rs     |   3 +-
 .../plc4x/src/ModbusPDUGetComEventLogResponse.rs   |   3 +-
 .../plc4x/src/ModbusPDUReadCoilsResponse.rs        |   3 +-
 .../ModbusPDUReadDeviceIdentificationRequest.rs    |   1 -
 .../ModbusPDUReadDeviceIdentificationResponse.rs   |   4 +-
 .../src/ModbusPDUReadDiscreteInputsResponse.rs     |   3 +-
 .../plc4x/src/ModbusPDUReadFifoQueueResponse.rs    |   6 +-
 .../plc4x/src/ModbusPDUReadFileRecordRequest.rs    |   7 +-
 .../plc4x/src/ModbusPDUReadFileRecordResponse.rs   |   7 +-
 .../src/ModbusPDUReadFileRecordResponseItem.rs     |   3 +-
 .../src/ModbusPDUReadHoldingRegistersResponse.rs   |   3 +-
 .../src/ModbusPDUReadInputRegistersResponse.rs     |   3 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.rs |   3 +-
 ...PDUReadWriteMultipleHoldingRegistersResponse.rs |   3 +-
 .../plc4x/src/ModbusPDUReportServerIdResponse.rs   |   3 +-
 .../plc4x/src/ModbusPDUWriteFileRecordRequest.rs   |   7 +-
 .../src/ModbusPDUWriteFileRecordRequestItem.rs     |   3 +-
 .../plc4x/src/ModbusPDUWriteFileRecordResponse.rs  |   7 +-
 .../src/ModbusPDUWriteFileRecordResponseItem.rs    |   3 +-
 .../src/ModbusPDUWriteMultipleCoilsRequest.rs      |   3 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.rs |   3 +-
 .../generated-sources/plc4x/src/ModbusTcpADU.rs    |   4 +-
 .../generated-sources/plc4x/src/S7Payload.rs       |   2 +
 27 files changed, 157 insertions(+), 51 deletions(-)

diff --git 
a/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/ExpressionVisitor.java
 
b/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/ExpressionVisitor.java
new file mode 100644
index 0000000000..13ba4223e6
--- /dev/null
+++ 
b/code-generation/language-rust/src/main/java/org/apache/plc4x/language/rust/ExpressionVisitor.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.language.rust;
+
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultComplexTypeDefinition;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultArrayTypeReference;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultBinaryTerm;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultNullLiteral;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultNumericLiteral;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultUnaryTerm;
+import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultVariableLiteral;
+import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.fields.NamedField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.TypedField;
+import 
org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference;
+import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
+
+import java.util.Optional;
+
+public class ExpressionVisitor {
+
+    private final DefaultComplexTypeDefinition type;
+    private final RustLanguageTemplateHelper helper;
+
+    public ExpressionVisitor(DefaultComplexTypeDefinition type, 
RustLanguageTemplateHelper helper) {
+        this.type = type;
+        this.helper = helper;
+    }
+
+    public String[] visitLiteral(DefaultVariableLiteral literal) {
+        switch (literal.getName()) {
+            case "COUNT":
+                return new 
String[]{this.visit(literal.getArgs().get().get(0))[0] + ".len()"};
+            case "ARRAY_SIZE_IN_BYTES":
+                String typeName = 
literal.getArgs().get().get(0).getDiscriminatorName();
+                // Get the dimension of the given type
+                Optional<Field> any = 
this.type.getAllFields().stream().filter(field -> field instanceof 
NamedField).filter(field -> typeName.equals(((NamedField) 
field).getName())).findAny();
+                if (any.isEmpty()) {
+                    throw new RuntimeException("Unable to get type of " + 
typeName);
+                }
+                TypeReference type = ((TypedField) any.get()).getType();
+
+                if (!(type instanceof DefaultArrayTypeReference)) {
+                    throw new RuntimeException("This should not happen!");
+                }
+                TypeReference innerType = ((DefaultArrayTypeReference) 
type).getElementTypeReference();
+                if (innerType instanceof SimpleTypeReference) {
+                    String numBits = 
Integer.toString(this.helper.getNumBits(((SimpleTypeReference) innerType)));
+                    return new 
String[]{this.visit(literal.getArgs().get().get(0))[0] + ".len() * " + numBits};
+                } else if (innerType instanceof ComplexTypeReference) {
+                    // sum up all entries
+                    return new String[]{"let mut s: u32 = 0;", "for x in &" + 
this.visit(literal.getArgs().get().get(0))[0] + " {", "\ts += 
x.get_length_in_bits();",  "};",  "s"};
+                } else {
+                    throw new RuntimeException("This should not happen!");
+                }
+            case "lengthInBytes":
+                return new String[]{"get_length_in_bytes()"};
+            case "lengthInBits":
+                return new String[]{"get_length_in_bits()"};
+            default:
+                if (literal.getChild().isPresent()) {
+                    return new String[]{"self." + literal.getName() + "." + 
this.visitLiteral(((DefaultVariableLiteral) literal.getChild().get()))[0]};
+                } else {
+                    return new String[]{"self." + literal.getName()};
+                }
+        }
+    }
+
+    public String[] visit(Term exp) {
+        if (exp instanceof DefaultUnaryTerm) {
+            return this.visit(((DefaultUnaryTerm) exp).getA());
+        }
+        if (exp instanceof DefaultVariableLiteral) {
+            return this.visitLiteral(((DefaultVariableLiteral) exp));
+        }
+        if (exp instanceof DefaultNumericLiteral) {
+            return new String[]{exp.stringRepresentation()};
+        }
+        if (exp instanceof DefaultBinaryTerm) {
+            return new String[]{this.visit(((DefaultBinaryTerm) 
exp).getA())[0] + " " + ((DefaultBinaryTerm) exp).getOperation() + " " + 
this.visit(((DefaultBinaryTerm) exp).getB())[0]};
+        }
+        throw new RuntimeException("Not yet implemented in visit: " + exp);
+    }
+}
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 f9398c089f..a1caf0ff09 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
@@ -505,6 +505,14 @@ public class RustLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
         throw new RuntimeException("Not implemented yet: " + typeReference);
     }
 
+    public String[] implementImplicit(Field field, 
DefaultComplexTypeDefinition type) {
+        if (!(field instanceof DefaultImplicitField)) {
+            throw new RuntimeException("Not supported yet");
+        }
+        ExpressionVisitor visitor = new ExpressionVisitor(type, this);
+        return visitor.visit(((DefaultImplicitField) 
field).getSerializeExpression());
+    }
+
     public String getLanguageTypeNameForTypeReference(TypeReference 
typeReference, boolean allowPrimitive) {
         Objects.requireNonNull(typeReference);
         if (typeReference instanceof ArrayTypeReference) {
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 ddc51dcb7a..44ea95d744 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
@@ -158,8 +158,8 @@ pub struct ${type.name} {
     pub ${field.name}: 
${helper.getLanguageTypeNameForTypeReference(field.type)}<#sep>,</#sep>
     <#elseif field.isArrayField()>
     pub ${field.name}: 
${helper.getLanguageTypeNameForTypeReference(field.type)}<#sep>,</#sep>
-    <#elseif field.isConstField()>
-    // Intentionally do nothing
+    <#elseif field.isConstField() || field.isImplicitField()>
+<#--    Intentionally do nothing-->
     <#elseif field.isChecksumField()>
     pub ${field.name}: 
${helper.getLanguageTypeNameForTypeReference(field.type)}<#sep>,</#sep>
     <#else>
@@ -172,7 +172,10 @@ impl ${type.name} {
     <#list type.fields as field>
     <#if field.isImplicitField()>
     pub fn ${field.name}(&self) -> 
${helper.getLanguageTypeNameForTypeReference(field.type)} {
-        0
+        <#list helper.implementImplicit(field, type) as line>
+        <#if !line_has_next>(</#if>${line}<#if !line_has_next>) as 
${helper.getLanguageTypeNameForTypeReference(field.type)}</#if>
+        </#list>
+<#--        ${helper.implementImplicit(field, type)} as 
${helper.getLanguageTypeNameForTypeReference(field.type)}-->
     }
     </#if>
     </#list>
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusConstants.rs 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusConstants.rs
index 97db293695..34782cd393 100644
--- a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusConstants.rs
+++ b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusConstants.rs
@@ -30,7 +30,6 @@ pub struct ModbusConstantsOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusConstants {
-    // Intentionally do nothing
 }
 
 impl ModbusConstants {
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusDeviceInformationObject.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusDeviceInformationObject.rs
index 7e61c46a5a..3cf1536cdf 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusDeviceInformationObject.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusDeviceInformationObject.rs
@@ -31,13 +31,12 @@ pub struct ModbusDeviceInformationObjectOptions {
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusDeviceInformationObject {
     pub objectId: u8,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='data', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='objectLength'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub data: Vec<u8>
 }
 
 impl ModbusDeviceInformationObject {
     pub fn objectLength(&self) -> u8 {
-        0
+        (self.data.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUGetComEventLogResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUGetComEventLogResponse.rs
index 716345e83d..efd6079180 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUGetComEventLogResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUGetComEventLogResponse.rs
@@ -31,7 +31,6 @@ pub struct ModbusPDUGetComEventLogResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUGetComEventLogResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='events', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=6}, operation='+'}} 
DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub status: u16,
     pub eventCount: u16,
     pub messageCount: u16,
@@ -40,7 +39,7 @@ pub struct ModbusPDUGetComEventLogResponse {
 
 impl ModbusPDUGetComEventLogResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.events.len() + 6) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadCoilsResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadCoilsResponse.rs
index 1b68c91d73..ad7099c5f1 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadCoilsResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadCoilsResponse.rs
@@ -31,13 +31,12 @@ pub struct ModbusPDUReadCoilsResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadCoilsResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadCoilsResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationRequest.rs
index 59c2b24852..9cee6a31ee 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationRequest.rs
@@ -32,7 +32,6 @@ pub struct ModbusPDUReadDeviceIdentificationRequestOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadDeviceIdentificationRequest {
-    // Intentionally do nothing
     pub level: ModbusDeviceInformationLevel,
     pub objectId: u8
 }
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationResponse.rs
index 03db7b7608..78d50b970a 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDeviceIdentificationResponse.rs
@@ -36,19 +36,17 @@ pub struct ModbusPDUReadDeviceIdentificationResponseOptions 
{
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadDeviceIdentificationResponse {
-    // Intentionally do nothing
     pub level: ModbusDeviceInformationLevel,
     pub individualAccess: bool,
     pub conformityLevel: ModbusDeviceInformationConformityLevel,
     pub moreFollows: ModbusDeviceInformationMoreFollows,
     pub nextObjectId: u8,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='objects', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='numberOfObjects'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub objects: Vec<ModbusDeviceInformationObject>
 }
 
 impl ModbusPDUReadDeviceIdentificationResponse {
     pub fn numberOfObjects(&self) -> u8 {
-        0
+        (self.objects.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDiscreteInputsResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDiscreteInputsResponse.rs
index dc51cc0cbd..70f0b6904c 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDiscreteInputsResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadDiscreteInputsResponse.rs
@@ -31,13 +31,12 @@ pub struct ModbusPDUReadDiscreteInputsResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadDiscreteInputsResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadDiscreteInputsResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFifoQueueResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFifoQueueResponse.rs
index b1aa19b6e1..1ee22779c2 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFifoQueueResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFifoQueueResponse.rs
@@ -31,17 +31,15 @@ pub struct ModbusPDUReadFifoQueueResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadFifoQueueResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultUnaryTerm{a=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='fifoValue', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=2}, operation='*'}, 
operation='()'}, b=DefaultNumericLiteral{number=2}, operation='+'}} 
DefaultTypedNamedField{name='byteCount'} DefaultTypedField{type=Abstr [...]
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultUnaryTerm{a=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='fifoValue', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=2}, operation='*'}, 
operation='()'}, b=DefaultNumericLiteral{number=2}, operation='/'}} 
DefaultTypedNamedField{name='fifoCount'} DefaultTypedField{type=Abstr [...]
     pub fifoValue: Vec<u16>
 }
 
 impl ModbusPDUReadFifoQueueResponse {
     pub fn byteCount(&self) -> u16 {
-        0
+        (self.fifoValue.len() * 2 + 2) as u16
     }
     pub fn fifoCount(&self) -> u16 {
-        0
+        (self.fifoValue.len() * 2 / 2) as u16
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordRequest.rs
index 5848f30098..0415f3be37 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordRequest.rs
@@ -33,13 +33,16 @@ pub struct ModbusPDUReadFileRecordRequestOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadFileRecordRequest {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='ARRAY_SIZE_IN_BYTES',
 typeReference='null', args=[DefaultVariableLiteral{name='items', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub items: Vec<ModbusPDUReadFileRecordRequestItem>
 }
 
 impl ModbusPDUReadFileRecordRequest {
     pub fn byteCount(&self) -> u8 {
-        0
+        let mut s: u32 = 0;
+        for x in &self.items {
+               s += x.get_length_in_bits();
+        };
+        (s) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponse.rs
index 4d583a30b1..4d4310b15e 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponse.rs
@@ -33,13 +33,16 @@ pub struct ModbusPDUReadFileRecordResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadFileRecordResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='ARRAY_SIZE_IN_BYTES',
 typeReference='null', args=[DefaultVariableLiteral{name='items', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub items: Vec<ModbusPDUReadFileRecordResponseItem>
 }
 
 impl ModbusPDUReadFileRecordResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        let mut s: u32 = 0;
+        for x in &self.items {
+               s += x.get_length_in_bits();
+        };
+        (s) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponseItem.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponseItem.rs
index d41ba7168c..4061d68023 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponseItem.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadFileRecordResponseItem.rs
@@ -30,14 +30,13 @@ pub struct ModbusPDUReadFileRecordResponseItemOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadFileRecordResponseItem {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='data', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=1}, operation='+'}} 
DefaultTypedNamedField{name='dataLength'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub referenceType: u8,
     pub data: Vec<u8>
 }
 
 impl ModbusPDUReadFileRecordResponseItem {
     pub fn dataLength(&self) -> u8 {
-        0
+        (self.data.len() + 1) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadHoldingRegistersResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadHoldingRegistersResponse.rs
index 83c3c2baf8..e5e8b4e7a4 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadHoldingRegistersResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadHoldingRegistersResponse.rs
@@ -31,13 +31,12 @@ pub struct ModbusPDUReadHoldingRegistersResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadHoldingRegistersResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadHoldingRegistersResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadInputRegistersResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadInputRegistersResponse.rs
index 34dcac2699..853d73ecb6 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadInputRegistersResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadInputRegistersResponse.rs
@@ -31,13 +31,12 @@ pub struct ModbusPDUReadInputRegistersResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadInputRegistersResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadInputRegistersResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersRequest.rs
index 098efcefce..498afdb948 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersRequest.rs
@@ -35,13 +35,12 @@ pub struct 
ModbusPDUReadWriteMultipleHoldingRegistersRequest {
     pub readQuantity: u16,
     pub writeStartingAddress: u16,
     pub writeQuantity: u16,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadWriteMultipleHoldingRegistersRequest {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersResponse.rs
index 4d946804a3..cc110457bf 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReadWriteMultipleHoldingRegistersResponse.rs
@@ -31,13 +31,12 @@ pub struct 
ModbusPDUReadWriteMultipleHoldingRegistersResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReadWriteMultipleHoldingRegistersResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReadWriteMultipleHoldingRegistersResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReportServerIdResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReportServerIdResponse.rs
index 2cc269cc36..f10f7f2b34 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReportServerIdResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUReportServerIdResponse.rs
@@ -31,13 +31,12 @@ pub struct ModbusPDUReportServerIdResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUReportServerIdResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUReportServerIdResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequest.rs
index b3fbe6e03c..98eeb6face 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequest.rs
@@ -33,13 +33,16 @@ pub struct ModbusPDUWriteFileRecordRequestOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUWriteFileRecordRequest {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='ARRAY_SIZE_IN_BYTES',
 typeReference='null', args=[DefaultVariableLiteral{name='items', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub items: Vec<ModbusPDUWriteFileRecordRequestItem>
 }
 
 impl ModbusPDUWriteFileRecordRequest {
     pub fn byteCount(&self) -> u8 {
-        0
+        let mut s: u32 = 0;
+        for x in &self.items {
+               s += x.get_length_in_bits();
+        };
+        (s) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequestItem.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequestItem.rs
index 4ff9ca7007..12e92e3931 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequestItem.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordRequestItem.rs
@@ -33,13 +33,12 @@ pub struct ModbusPDUWriteFileRecordRequestItem {
     pub referenceType: u8,
     pub fileNumber: u16,
     pub recordNumber: u16,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='recordData', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=2}, operation='/'}} 
DefaultTypedNamedField{name='recordLength'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=16}} DefaultField{attributes={}}
     pub recordData: Vec<u8>
 }
 
 impl ModbusPDUWriteFileRecordRequestItem {
     pub fn recordLength(&self) -> u16 {
-        0
+        (self.recordData.len() / 2) as u16
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponse.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponse.rs
index 1a91ee9d5a..702e66323f 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponse.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponse.rs
@@ -33,13 +33,16 @@ pub struct ModbusPDUWriteFileRecordResponseOptions {
 }
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusPDUWriteFileRecordResponse {
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='ARRAY_SIZE_IN_BYTES',
 typeReference='null', args=[DefaultVariableLiteral{name='items', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub items: Vec<ModbusPDUWriteFileRecordResponseItem>
 }
 
 impl ModbusPDUWriteFileRecordResponse {
     pub fn byteCount(&self) -> u8 {
-        0
+        let mut s: u32 = 0;
+        for x in &self.items {
+               s += x.get_length_in_bits();
+        };
+        (s) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponseItem.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponseItem.rs
index 9fe789f227..8f5fc38650 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponseItem.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteFileRecordResponseItem.rs
@@ -33,13 +33,12 @@ pub struct ModbusPDUWriteFileRecordResponseItem {
     pub referenceType: u8,
     pub fileNumber: u16,
     pub recordNumber: u16,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultVariableLiteral{name='COUNT',
 typeReference='null', args=[DefaultVariableLiteral{name='recordData', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}, b=DefaultNumericLiteral{number=2}, operation='/'}} 
DefaultTypedNamedField{name='recordLength'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=16}} DefaultField{attributes={}}
     pub recordData: Vec<u8>
 }
 
 impl ModbusPDUWriteFileRecordResponseItem {
     pub fn recordLength(&self) -> u16 {
-        0
+        (self.recordData.len() / 2) as u16
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleCoilsRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleCoilsRequest.rs
index 4f0cdbfe7b..9c9c2a12a8 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleCoilsRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleCoilsRequest.rs
@@ -33,13 +33,12 @@ pub struct ModbusPDUWriteMultipleCoilsRequestOptions {
 pub struct ModbusPDUWriteMultipleCoilsRequest {
     pub startingAddress: u16,
     pub quantity: u16,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUWriteMultipleCoilsRequest {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleHoldingRegistersRequest.rs
 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleHoldingRegistersRequest.rs
index c1918a64f1..1c57393db9 100644
--- 
a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleHoldingRegistersRequest.rs
+++ 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusPDUWriteMultipleHoldingRegistersRequest.rs
@@ -33,13 +33,12 @@ pub struct 
ModbusPDUWriteMultipleHoldingRegistersRequestOptions {
 pub struct ModbusPDUWriteMultipleHoldingRegistersRequest {
     pub startingAddress: u16,
     pub quantity: u16,
-        // -> 
DefaultImplicitField{serializeExpression=DefaultVariableLiteral{name='COUNT', 
typeReference='null', args=[DefaultVariableLiteral{name='value', 
typeReference='null', args=null, index=null, child=null}], index=null, 
child=null}} DefaultTypedNamedField{name='byteCount'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=8}} DefaultField{attributes={}}
     pub value: Vec<u8>
 }
 
 impl ModbusPDUWriteMultipleHoldingRegistersRequest {
     pub fn byteCount(&self) -> u8 {
-        0
+        (self.value.len()) as u8
     }
 }
 
diff --git a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusTcpADU.rs 
b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusTcpADU.rs
index d6d9837e40..5ff7d7b5f8 100644
--- a/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusTcpADU.rs
+++ b/plc4rust/modbus/target/generated-sources/plc4x/src/ModbusTcpADU.rs
@@ -36,15 +36,13 @@ pub struct ModbusTcpADUOptions {
 #[derive(PartialEq, Debug, Clone)]
 pub struct ModbusTcpADU {
     pub transactionIdentifier: u16,
-    // Intentionally do nothing
-        // -> 
DefaultImplicitField{serializeExpression=DefaultBinaryTerm{a=DefaultVariableLiteral{name='pdu',
 typeReference='null', args=null, index=null, 
child=DefaultVariableLiteral{name='lengthInBytes', typeReference='null', 
args=null, index=null, child=null}}, b=DefaultNumericLiteral{number=1}, 
operation='+'}} DefaultTypedNamedField{name='length'} 
DefaultTypedField{type=AbstractSimpleTypeReference{baseType=UINT, 
sizeInBits=16}} DefaultField{attributes={byteOrder=DefaultVariableLitera [...]
     pub unitIdentifier: u8,
     pub pdu: ModbusPDU
 }
 
 impl ModbusTcpADU {
     pub fn length(&self) -> u16 {
-        0
+        (self.pdu.get_length_in_bytes() + 1) as u16
     }
 }
 
diff --git a/plc4rust/s7/target/generated-sources/plc4x/src/S7Payload.rs 
b/plc4rust/s7/target/generated-sources/plc4x/src/S7Payload.rs
index a6c92e6280..4887f3b4f3 100644
--- a/plc4rust/s7/target/generated-sources/plc4x/src/S7Payload.rs
+++ b/plc4rust/s7/target/generated-sources/plc4x/src/S7Payload.rs
@@ -55,6 +55,8 @@ impl Message for S7Payload {
     }
 
     fn serialize<T: Write>(&self, writer: &mut WriteBuffer<T>) -> 
Result<usize, Error> {
+        let a = vec![];
+        a.len()
         match self {
             S7Payload::S7PayloadReadVarResponse(msg) => {
                 msg.serialize(writer)

Reply via email to