Skip to content

Commit

Permalink
fix(plc4j/codgen): enum wip
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Oct 22, 2021
1 parent 90e40fd commit 5753d78
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -367,10 +367,14 @@ public String getReadBufferReadMethodCall(String logicalName, SimpleTypeReferenc
}

public String getDataReaderCall(TypeReference typeReference) {
return getDataReaderCall(typeReference, "enumForValue");
}

public String getDataReaderCall(TypeReference typeReference, String resolverMethod) {
if (isEnumTypeReference(typeReference)) {
final String languageTypeName = getLanguageTypeNameForTypeReference(typeReference);
final SimpleTypeReference enumBaseTypeReference = getEnumBaseTypeReference(typeReference);
return "new DataReaderEnumDefault<>(" + languageTypeName + "::enumForValue, " + getDataReaderCall(enumBaseTypeReference) + ")";
return "new DataReaderEnumDefault<>(" + languageTypeName + "::" + resolverMethod + ", " + getDataReaderCall(enumBaseTypeReference) + ")";
} else if (typeReference.isSimpleTypeReference()) {
SimpleTypeReference simpleTypeReference = typeReference.asSimpleTypeReference().orElseThrow(IllegalStateException::new);
return getDataReaderCall(simpleTypeReference);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,15 +257,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#-- TODO: Port this -->
<#case "enum">
<#assign enumField = field.asEnumField().orElseThrow()>
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>

readBuffer.pullContext("${enumField.name}");
// Enum field (${enumField.name})
<#if enumField.fieldName.isPresent()>
${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.firstEnumForField${enumField.fieldName.orElseThrow()?cap_first}(${helper.getReadBufferReadMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "", enumField)});
<#else>
${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.enumForValue(${helper.getReadBufferReadMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "", enumField)});
</#if>
readBuffer.closeContext("${enumField.name}");
${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", "${helper.getTypeDefinitionForTypeReference(enumField.type).name}", ${helper.getDataReaderCall(helper.getEnumBaseTypeReference(enumField.type))});
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ discriminatorField
;

enumField
: 'enum' type=typeReference name=idExpression (fieldName=idExpression)?
: 'enum' type=typeReference name=idExpression fieldName=idExpression
;

implicitField
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

import java.util.Map;
import java.util.Objects;
import java.util.Optional;

public class DefaultEnumField extends DefaultField implements EnumField {

Expand All @@ -36,7 +35,7 @@ public DefaultEnumField(Map<String, Term> attributes, TypeReference type, String
super(attributes);
this.type = Objects.requireNonNull(type);
this.name = Objects.requireNonNull(name);
this.fieldName = fieldName;
this.fieldName = Objects.requireNonNull(fieldName);
}

public TypeReference getType() {
Expand All @@ -47,8 +46,8 @@ public String getName() {
return name;
}

public Optional<String> getFieldName() {
return Optional.ofNullable(fieldName);
public String getFieldName() {
return fieldName;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@
*/
package org.apache.plc4x.java.spi.codegen.fields;

import org.apache.commons.lang3.NotImplementedException;
import org.apache.plc4x.java.spi.codegen.io.DataReader;
import org.apache.plc4x.java.spi.generation.ParseException;
import org.apache.plc4x.java.spi.generation.WithReaderArgs;
import org.apache.plc4x.java.spi.generation.WithReaderWriterArgs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -30,11 +32,14 @@ public class FieldReaderEnum<T> implements FieldReader<T> {

@Override
public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
throw new IllegalStateException("not possible with checksum field");
throw new NotImplementedException();
}

public T readField(String logicalName, DataReader<T> dataReader, String propertyName, WithReaderArgs... readerArgs) throws ParseException {
return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
public T readField(String logicalName, String innerName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
dataReader.pullContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
T result = switchByteOrderIfNecessary(() -> dataReader.read(innerName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
dataReader.closeContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
return result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ public T read(String logicalName, WithReaderArgs... readerArgs) throws ParseExce
}

public T read(String logicalName, Function<I, T> enumResolver, WithReaderArgs... readerArgs) throws ParseException {
// TODO: ensure type safety
I rawValue = (I) dataReader.read(logicalName, readerArgs);
I rawValue = dataReader.read(logicalName, readerArgs);
return enumResolver.apply(rawValue);
}

Expand Down

0 comments on commit 5753d78

Please sign in to comment.