Skip to content

Commit

Permalink
refactor(plc4go/spi): change the API of Parse
Browse files Browse the repository at this point in the history
+ The default parse now uses a ReadBufferByteBased with BigEndian (TBD get it from mspec)
+ The old Parse is available under the name ParseWithBuffer
  • Loading branch information
sruehl committed Nov 2, 2022
1 parent 5c28603 commit c5fa0a3
Show file tree
Hide file tree
Showing 2,323 changed files with 16,449 additions and 7,333 deletions.
Expand Up @@ -745,7 +745,12 @@ func (m *_${type.name}) GetLengthInBytes() uint16 {

<#assign hasParserArguments=parserArguments?has_content/>
<#assign parserArgumentList><#if hasParserArguments><#list parserArguments as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if></#assign>
func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${parserArgumentList}</#if>) (${type.name}, error) {
<#assign parserArgumentNameList><#if hasParserArguments><#list parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if></#assign>
func ${type.name}Parse(theBytes []byte<#if hasParserArguments>, ${parserArgumentList}</#if>) (${type.name}, error) {
return ${type.name}ParseWithBuffer(utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian))<#if hasParserArguments>, ${parserArgumentNameList}</#if>) <@emitImport import="encoding/binary" /> // TODO: get endianness from mspec
}

func ${type.name}ParseWithBuffer(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${parserArgumentList}</#if>) (${type.name}, error) {
positionAware := readBuffer
_ = positionAware
if pullErr := readBuffer.PullContext("${type.name}"); pullErr != nil {
Expand Down Expand Up @@ -835,7 +840,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
${typeName}Parse(readBuffer${refParams})
${typeName}ParseWithBuffer(readBuffer${refParams})
</#if>
</@compress>

Expand Down Expand Up @@ -880,7 +885,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
${typeName}Parse(readBuffer${refParams})
${typeName}ParseWithBuffer(readBuffer${refParams})
</#if>
</@compress>

Expand Down Expand Up @@ -926,7 +931,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
${typeName}Parse(readBuffer${refParams})
${typeName}ParseWithBuffer(readBuffer${refParams})
</#if>
</@compress>

Expand Down Expand Up @@ -987,7 +992,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
return nil, errors.Wrap(_${constField.name}Err, "Error serializing '${constField.name}' field")<@emitImport import="github.com/pkg/errors" />
}
<#else>
${constField.name}, _${constField.name}Err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer)
${constField.name}, _${constField.name}Err := ${helper.getLanguageTypeNameForField(field)}ParseWithBuffer(readBuffer)
if _${constField.name}Err != nil {
return nil, errors.Wrap(_${constField.name}Err, "Error parsing '${constField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
Expand All @@ -1011,7 +1016,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
if pullErr := readBuffer.PullContext("${namedField.name}"); pullErr != nil {
return nil, errors.Wrap(pullErr, "Error pulling for ${namedField.name}")<@emitImport import="github.com/pkg/errors" />
}
${helper.getVariableName(field)}_temp, _${discriminatorField.name}Err := ${helper.getLanguageTypeNameForField(discriminatorField)}Parse(readBuffer)
${helper.getVariableName(field)}_temp, _${discriminatorField.name}Err := ${helper.getLanguageTypeNameForField(discriminatorField)}ParseWithBuffer(readBuffer)
var ${helper.getVariableName(field)} ${helper.getLanguageTypeNameForField(discriminatorField)} = ${helper.getVariableName(field)}_temp
if closeErr := readBuffer.CloseContext("${namedField.name}"); closeErr != nil {
return nil, errors.Wrap(closeErr, "Error closing for ${namedField.name}")<@emitImport import="github.com/pkg/errors" />
Expand Down Expand Up @@ -1164,7 +1169,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
if pullErr := readBuffer.PullContext("${optionalField.name}"); pullErr != nil {
return nil, errors.Wrap(pullErr, "Error pulling for ${optionalField.name}")<@emitImport import="github.com/pkg/errors" />
}
_val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer)
_val, _err := ${helper.getLanguageTypeNameForField(field)}ParseWithBuffer(readBuffer)
if _err != nil {
return nil, errors.Wrap(_err, "Error parsing '${optionalField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
Expand Down Expand Up @@ -1196,7 +1201,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
_val, _err := ${typeName}Parse(readBuffer${refParams})
_val, _err := ${typeName}ParseWithBuffer(readBuffer${refParams})
</@compress>

switch {
Expand Down Expand Up @@ -1227,7 +1232,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
return nil, errors.Wrap(_err, "Error parsing '${assertField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
<#elseif helper.isEnumField(field)>
${assertField.name}, _err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer)
${assertField.name}, _err := ${helper.getLanguageTypeNameForField(field)}ParseWithBuffer(readBuffer)
if _err != nil {
return nil, errors.Wrap(_err, "Error parsing '${assertField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
Expand All @@ -1244,7 +1249,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
<#assign hasRefParams=complexTypeReference.params.isPresent() && typeDefinition.parserArguments.isPresent()>
<#assign refParams> <#if hasRefParams>, <#list complexTypeReference.params.orElseThrow() as typeParam>${helper.toTypedParseExpression(assertField, null, typeParam, null)}<#sep>, </#sep></#list> </#if> </#assign>
</@compress>
_val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer${refParams})
_val, _err := ${helper.getLanguageTypeNameForField(field)}ParseWithBuffer(readBuffer${refParams})
if _err != nil {
return nil, errors.Wrap(_err, "Error parsing '${assertField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
Expand Down Expand Up @@ -1333,7 +1338,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
${typeName}Parse(readBuffer${refParams})
${typeName}ParseWithBuffer(readBuffer${refParams})
</#if>
</@compress>

Expand Down Expand Up @@ -1404,7 +1409,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#if>: // ${case.name}
</@compress>

_childTemp, typeSwitchError = ${case.name}Parse(readBuffer<#if case.allParserArguments.isPresent()>, <#list case.allParserArguments.orElseThrow() as parserArgument><#if <#--TODO: here DF1ResponseMessage throws a payloadLength not present: meaning that some feature is not rightfully implemented as the result should be a error not a missing pointer-->type.getPropertyFieldFromThisOrParentByName(parserArgument.name).isPresent() && type.getPropertyFieldFromThisOrParentByName(parserArgument.name).orElseThrow().isOptionalField()>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
_childTemp, typeSwitchError = ${case.name}ParseWithBuffer(readBuffer<#if case.allParserArguments.isPresent()>, <#list case.allParserArguments.orElseThrow() as parserArgument><#if <#--TODO: here DF1ResponseMessage throws a payloadLength not present: meaning that some feature is not rightfully implemented as the result should be a error not a missing pointer-->type.getPropertyFieldFromThisOrParentByName(parserArgument.name).isPresent() && type.getPropertyFieldFromThisOrParentByName(parserArgument.name).orElseThrow().isOptionalField()>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
</#list>
default:
typeSwitchError = errors.Errorf("Unmapped type for<#if switchField.getDiscriminatorExpressions()?has_content> parameters [<#list switchField.getDiscriminatorExpressions() as discriminatorExpression>${discriminatorExpression.stringRepresentation()}=%v<#sep>, </#sep></#list>]</#if>"<#if switchField.getDiscriminatorExpressions()?has_content>, <#list switchField.getDiscriminatorExpressions() as discriminatorExpression>${helper.toParseExpression(null, null, discriminatorExpression, parserArguments)}<#sep>, </#sep></#list></#if>)<@emitImport import="github.com/pkg/errors" />
Expand Down Expand Up @@ -1462,7 +1467,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
if pullErr := readBuffer.PullContext("${peekField.name}"); pullErr != nil {
return nil, errors.Wrap(pullErr, "Error pulling for ${peekField.name}")<@emitImport import="github.com/pkg/errors" />
}
${peekField.name}, _err := ${helper.getLanguageTypeNameForField(field)}Parse(readBuffer)
${peekField.name}, _err := ${helper.getLanguageTypeNameForField(field)}ParseWithBuffer(readBuffer)
if _err != nil {
return nil, errors.Wrap(_err, "Error parsing '${peekField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
}
Expand Down Expand Up @@ -1493,7 +1498,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
</#list>
</#if>
</#assign>
${peekField.name}, _ := ${typeName}Parse(readBuffer${refParams})
${peekField.name}, _ := ${typeName}ParseWithBuffer(readBuffer${refParams})
</@compress>
</#if>

Expand Down
Expand Up @@ -68,7 +68,11 @@ import (

<#-- TODO: the code below implies that parserArguments will be null if not present... not pretty -->
<#if type.parserArguments.isPresent()><#assign parserArguments=type.parserArguments.orElseThrow()></#if>
func ${type.name}Parse(readBuffer utils.ReadBuffer<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name} <#if parserArgument.type.isNonSimpleTypeReference() && !parserArgument.type.isEnumTypeReference()>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
func ${type.name}Parse(theBytes []byte<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name} <#if parserArgument.type.isNonSimpleTypeReference() && !parserArgument.type.isEnumTypeReference()>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
return ${type.name}ParseWithBuffer(utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian))<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>) // TODO: get endianness from mspec
}

func ${type.name}ParseWithBuffer(readBuffer utils.ReadBuffer<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name} <#if parserArgument.type.isNonSimpleTypeReference() && !parserArgument.type.isEnumTypeReference()>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
readBuffer.PullContext("${type.name}")
switch {
<#list type.switchField.orElseThrow().cases as case>
Expand Down
Expand Up @@ -179,7 +179,11 @@ func (m ${type.name}) GetLengthInBytes() uint16 {
<#if type.type?has_content && type.type.orElseThrow().isSimpleTypeReference()>
<#assign simpleTypeReference = type.type.orElseThrow().asSimpleTypeReference().orElseThrow()>
<#if simpleTypeReference.getSizeInBits() != -1>
func ${type.name}Parse(readBuffer utils.ReadBuffer) (${type.name}, error) {
func ${type.name}Parse(theBytes []byte) (${type.name}, error) {
return ${type.name}ParseWithBuffer(utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian))) // TODO: get endianness from mspec
}

func ${type.name}ParseWithBuffer(readBuffer utils.ReadBuffer) (${type.name}, error) {
val, err := ${helper.getReadBufferReadMethodCall(type.name, type.type.orElseThrow(), null)}
if err != nil {
return <#if type.type.orElseThrow().isStringTypeReference() || type.type.orElseThrow().isVstringTypeReference()>""<#elseif baseType == "bool">false<#else>0</#if>, errors.Wrap(err, "error reading ${type.name}")
Expand Down
Expand Up @@ -76,7 +76,7 @@ func (m ${helper.getSanitizedProtocolName()?cap_first}ParserHelper) Parse(typeNa
</#if>
</#list>
</#if>
return model.${typeDefinition.name}Parse(io<#if typeDefinition.parserArguments.isPresent()>, <#list typeDefinition.parserArguments.orElseThrow() as parserArgument>${parserArgument.name}<#sep>, </#list></#if>)
return model.${typeDefinition.name}ParseWithBuffer(io<#if typeDefinition.parserArguments.isPresent()>, <#list typeDefinition.parserArguments.orElseThrow() as parserArgument>${parserArgument.name}<#sep>, </#list></#if>)
</#list>
}
return nil, errors.Errorf("Unsupported type %s", typeName)
Expand Down
Expand Up @@ -117,9 +117,9 @@ func (m ${helper.getSanitizedProtocolName()?cap_first}XmlParserHelper) Parse(typ
</#if>
</#list>
<#assign parserArgumentList><#list typeDefinition.parserArguments.orElseThrow() as parserArgument>${parserArgument.name}<#sep>, </#sep> </#list> </#assign>
return model.${typeDefinition.name}Parse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), ${parserArgumentList})
return model.${typeDefinition.name}ParseWithBuffer(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), ${parserArgumentList})
<#else>
return model.${typeDefinition.name}Parse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
return model.${typeDefinition.name}ParseWithBuffer(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
</#if>
</#list>
}
Expand Down
4 changes: 2 additions & 2 deletions plc4go/internal/ads/MessageCodec.go
Expand Up @@ -84,8 +84,8 @@ func (m *MessageCodec) Receive() (spi.Message, error) {
// TODO: Possibly clean up ...
return nil, nil
}
rb := utils.NewLittleEndianReadBufferByteBased(data)
tcpPacket, err := model.AmsTCPPacketParse(rb)
rb := utils.NewReadBufferByteBased(data, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian))
tcpPacket, err := model.AmsTCPPacketParseWithBuffer(rb)
if err != nil {
log.Warn().Err(err).Msg("error parsing")
// TODO: Possibly clean up ...
Expand Down
7 changes: 4 additions & 3 deletions plc4go/internal/ads/Reader.go
Expand Up @@ -21,6 +21,7 @@ package ads

import (
"context"
"encoding/binary"
"github.com/apache/plc4x/plc4go/pkg/api/model"
"github.com/apache/plc4x/plc4go/pkg/api/values"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/ads/readwrite/model"
Expand Down Expand Up @@ -354,12 +355,12 @@ func (m *Reader) ToPlc4xReadResponse(amsTcpPaket readWriteModel.AmsTCPPacket, re
responseCodes := map[string]model.PlcResponseCode{}
switch data := amsTcpPaket.GetUserdata().(type) {
case readWriteModel.AdsReadResponse:
rb = utils.NewLittleEndianReadBufferByteBased(data.GetData())
rb = utils.NewReadBufferByteBased(data.GetData(), utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian))
for _, fieldName := range readRequest.GetFieldNames() {
responseCodes[fieldName] = model.PlcResponseCode_OK
}
case readWriteModel.AdsReadWriteResponse:
rb = utils.NewLittleEndianReadBufferByteBased(data.GetData())
rb = utils.NewReadBufferByteBased(data.GetData(), utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian))
// When parsing a multi-item response, the error codes of each items come
// in sequence and then come the values.
for _, fieldName := range readRequest.GetFieldNames() {
Expand Down Expand Up @@ -398,7 +399,7 @@ func (m *Reader) ToPlc4xReadResponse(amsTcpPaket readWriteModel.AmsTCPPacket, re

// Decode the data according to the information from the request
log.Trace().Msg("decode data")
value, err := readWriteModel.DataItemParse(rb, field.GetDatatype().PlcValueType(), field.GetStringLength())
value, err := readWriteModel.DataItemParseWithBuffer(rb, field.GetDatatype().PlcValueType(), field.GetStringLength())
if err != nil {
log.Error().Err(err).Msg("Error parsing data item")
responseCodes[fieldName] = model.PlcResponseCode_INTERNAL_ERROR
Expand Down
5 changes: 2 additions & 3 deletions plc4go/internal/bacnetip/Discoverer.go
Expand Up @@ -24,7 +24,6 @@ import (
"fmt"
"github.com/IBM/netaddr"
internalModel "github.com/apache/plc4x/plc4go/spi/model"
"github.com/apache/plc4x/plc4go/spi/utils"
"github.com/libp2p/go-reuseport"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
Expand Down Expand Up @@ -167,7 +166,7 @@ func broadcastAndDiscover(ctx context.Context, communicationChannels []communica
return
}
log.Debug().Stringer("addr", addr).Msg("Received broadcast bvlc")
incomingBvlc, err := driverModel.BVLCParse(utils.NewReadBufferByteBased(buf[:n]))
incomingBvlc, err := driverModel.BVLCParse(buf[:n])
if err != nil {
log.Warn().Err(err).Msg("Could not parse bvlc")
blockingReadChan <- true
Expand Down Expand Up @@ -202,7 +201,7 @@ func broadcastAndDiscover(ctx context.Context, communicationChannels []communica
return
}
log.Debug().Stringer("addr", addr).Msg("Received broadcast bvlc")
incomingBvlc, err := driverModel.BVLCParse(utils.NewReadBufferByteBased(buf[:n]))
incomingBvlc, err := driverModel.BVLCParse(buf[:n])
if err != nil {
log.Warn().Err(err).Msg("Could not parse bvlc")
blockingReadChan <- true
Expand Down
4 changes: 1 addition & 3 deletions plc4go/internal/bacnetip/MessageCodec.go
Expand Up @@ -24,7 +24,6 @@ import (
"github.com/apache/plc4x/plc4go/spi"
"github.com/apache/plc4x/plc4go/spi/default"
"github.com/apache/plc4x/plc4go/spi/transports"
"github.com/apache/plc4x/plc4go/spi/utils"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
)
Expand Down Expand Up @@ -82,8 +81,7 @@ func (m *MessageCodec) Receive() (spi.Message, error) {
// TODO: Possibly clean up ...
return nil, nil
}
rb := utils.NewReadBufferByteBased(data)
bvlcPacket, err := model.BVLCParse(rb)
bvlcPacket, err := model.BVLCParse(data)
if err != nil {
log.Warn().Err(err).Msg("error parsing")
// TODO: Possibly clean up ...
Expand Down

0 comments on commit c5fa0a3

Please sign in to comment.