blob: ee55a56dc1973306afcaa785b5e420f46baa9aef [file] [log] [blame]
/*
* 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
*
* https://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 model
import (
"context"
"fmt"
"github.com/pkg/errors"
"github.com/rs/zerolog"
. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
. "github.com/apache/plc4x/plc4go/spi/codegen/io"
"github.com/apache/plc4x/plc4go/spi/utils"
)
// Code generated by code-generation. DO NOT EDIT.
// Request is the corresponding interface of Request
type Request interface {
RequestContract
RequestRequirements
fmt.Stringer
utils.LengthAware
utils.Serializable
utils.Copyable
// IsRequest is a marker method to prevent unintentional type checks (interfaces of same signature)
IsRequest()
// CreateBuilder creates a RequestBuilder
CreateRequestBuilder() RequestBuilder
}
// RequestContract provides a set of functions which can be overwritten by a sub struct
type RequestContract interface {
// GetPeekedByte returns PeekedByte (property field)
GetPeekedByte() RequestType
// GetStartingCR returns StartingCR (property field)
GetStartingCR() *RequestType
// GetResetMode returns ResetMode (property field)
GetResetMode() *RequestType
// GetSecondPeek returns SecondPeek (property field)
GetSecondPeek() RequestType
// GetTermination returns Termination (property field)
GetTermination() RequestTermination
// GetActualPeek returns ActualPeek (virtual field)
GetActualPeek() RequestType
// GetCBusOptions() returns a parser argument
GetCBusOptions() CBusOptions
// IsRequest is a marker method to prevent unintentional type checks (interfaces of same signature)
IsRequest()
// CreateBuilder creates a RequestBuilder
CreateRequestBuilder() RequestBuilder
}
// RequestRequirements provides a set of functions which need to be implemented by a sub struct
type RequestRequirements interface {
GetLengthInBits(ctx context.Context) uint16
GetLengthInBytes(ctx context.Context) uint16
// GetActualPeek returns ActualPeek (discriminator field)
GetActualPeek() RequestType
}
// _Request is the data-structure of this message
type _Request struct {
_SubType interface {
RequestContract
RequestRequirements
}
PeekedByte RequestType
StartingCR *RequestType
ResetMode *RequestType
SecondPeek RequestType
Termination RequestTermination
// Arguments.
CBusOptions CBusOptions
}
var _ RequestContract = (*_Request)(nil)
// NewRequest factory function for _Request
func NewRequest(peekedByte RequestType, startingCR *RequestType, resetMode *RequestType, secondPeek RequestType, termination RequestTermination, cBusOptions CBusOptions) *_Request {
if termination == nil {
panic("termination of type RequestTermination for Request must not be nil")
}
return &_Request{PeekedByte: peekedByte, StartingCR: startingCR, ResetMode: resetMode, SecondPeek: secondPeek, Termination: termination, CBusOptions: cBusOptions}
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Builder
///////////////////////
// RequestBuilder is a builder for Request
type RequestBuilder interface {
utils.Copyable
// WithMandatoryFields adds all mandatory fields (convenience for using multiple builder calls)
WithMandatoryFields(peekedByte RequestType, secondPeek RequestType, termination RequestTermination) RequestBuilder
// WithPeekedByte adds PeekedByte (property field)
WithPeekedByte(RequestType) RequestBuilder
// WithStartingCR adds StartingCR (property field)
WithOptionalStartingCR(RequestType) RequestBuilder
// WithResetMode adds ResetMode (property field)
WithOptionalResetMode(RequestType) RequestBuilder
// WithSecondPeek adds SecondPeek (property field)
WithSecondPeek(RequestType) RequestBuilder
// WithTermination adds Termination (property field)
WithTermination(RequestTermination) RequestBuilder
// WithTerminationBuilder adds Termination (property field) which is build by the builder
WithTerminationBuilder(func(RequestTerminationBuilder) RequestTerminationBuilder) RequestBuilder
// WithArgCBusOptions sets a parser argument
WithArgCBusOptions(CBusOptions) RequestBuilder
// AsRequestSmartConnectShortcut converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestSmartConnectShortcut() RequestSmartConnectShortcutBuilder
// AsRequestReset converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestReset() RequestResetBuilder
// AsRequestDirectCommandAccess converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestDirectCommandAccess() RequestDirectCommandAccessBuilder
// AsRequestCommand converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestCommand() RequestCommandBuilder
// AsRequestNull converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestNull() RequestNullBuilder
// AsRequestEmpty converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestEmpty() RequestEmptyBuilder
// AsRequestObsolete converts this build to a subType of Request. It is always possible to return to current builder using Done()
AsRequestObsolete() RequestObsoleteBuilder
// Build builds the Request or returns an error if something is wrong
PartialBuild() (RequestContract, error)
// MustBuild does the same as Build but panics on error
PartialMustBuild() RequestContract
// Build builds the Request or returns an error if something is wrong
Build() (Request, error)
// MustBuild does the same as Build but panics on error
MustBuild() Request
}
// NewRequestBuilder() creates a RequestBuilder
func NewRequestBuilder() RequestBuilder {
return &_RequestBuilder{_Request: new(_Request)}
}
type _RequestChildBuilder interface {
utils.Copyable
setParent(RequestContract)
buildForRequest() (Request, error)
}
type _RequestBuilder struct {
*_Request
childBuilder _RequestChildBuilder
err *utils.MultiError
}
var _ (RequestBuilder) = (*_RequestBuilder)(nil)
func (b *_RequestBuilder) WithMandatoryFields(peekedByte RequestType, secondPeek RequestType, termination RequestTermination) RequestBuilder {
return b.WithPeekedByte(peekedByte).WithSecondPeek(secondPeek).WithTermination(termination)
}
func (b *_RequestBuilder) WithPeekedByte(peekedByte RequestType) RequestBuilder {
b.PeekedByte = peekedByte
return b
}
func (b *_RequestBuilder) WithOptionalStartingCR(startingCR RequestType) RequestBuilder {
b.StartingCR = &startingCR
return b
}
func (b *_RequestBuilder) WithOptionalResetMode(resetMode RequestType) RequestBuilder {
b.ResetMode = &resetMode
return b
}
func (b *_RequestBuilder) WithSecondPeek(secondPeek RequestType) RequestBuilder {
b.SecondPeek = secondPeek
return b
}
func (b *_RequestBuilder) WithTermination(termination RequestTermination) RequestBuilder {
b.Termination = termination
return b
}
func (b *_RequestBuilder) WithTerminationBuilder(builderSupplier func(RequestTerminationBuilder) RequestTerminationBuilder) RequestBuilder {
builder := builderSupplier(b.Termination.CreateRequestTerminationBuilder())
var err error
b.Termination, err = builder.Build()
if err != nil {
if b.err == nil {
b.err = &utils.MultiError{MainError: errors.New("sub builder failed")}
}
b.err.Append(errors.Wrap(err, "RequestTerminationBuilder failed"))
}
return b
}
func (b *_RequestBuilder) WithArgCBusOptions(cBusOptions CBusOptions) RequestBuilder {
b.CBusOptions = cBusOptions
return b
}
func (b *_RequestBuilder) PartialBuild() (RequestContract, error) {
if b.Termination == nil {
if b.err == nil {
b.err = new(utils.MultiError)
}
b.err.Append(errors.New("mandatory field 'termination' not set"))
}
if b.err != nil {
return nil, errors.Wrap(b.err, "error occurred during build")
}
return b._Request.deepCopy(), nil
}
func (b *_RequestBuilder) PartialMustBuild() RequestContract {
build, err := b.PartialBuild()
if err != nil {
panic(err)
}
return build
}
func (b *_RequestBuilder) AsRequestSmartConnectShortcut() RequestSmartConnectShortcutBuilder {
if cb, ok := b.childBuilder.(RequestSmartConnectShortcutBuilder); ok {
return cb
}
cb := NewRequestSmartConnectShortcutBuilder().(*_RequestSmartConnectShortcutBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestReset() RequestResetBuilder {
if cb, ok := b.childBuilder.(RequestResetBuilder); ok {
return cb
}
cb := NewRequestResetBuilder().(*_RequestResetBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestDirectCommandAccess() RequestDirectCommandAccessBuilder {
if cb, ok := b.childBuilder.(RequestDirectCommandAccessBuilder); ok {
return cb
}
cb := NewRequestDirectCommandAccessBuilder().(*_RequestDirectCommandAccessBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestCommand() RequestCommandBuilder {
if cb, ok := b.childBuilder.(RequestCommandBuilder); ok {
return cb
}
cb := NewRequestCommandBuilder().(*_RequestCommandBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestNull() RequestNullBuilder {
if cb, ok := b.childBuilder.(RequestNullBuilder); ok {
return cb
}
cb := NewRequestNullBuilder().(*_RequestNullBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestEmpty() RequestEmptyBuilder {
if cb, ok := b.childBuilder.(RequestEmptyBuilder); ok {
return cb
}
cb := NewRequestEmptyBuilder().(*_RequestEmptyBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) AsRequestObsolete() RequestObsoleteBuilder {
if cb, ok := b.childBuilder.(RequestObsoleteBuilder); ok {
return cb
}
cb := NewRequestObsoleteBuilder().(*_RequestObsoleteBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_RequestBuilder) Build() (Request, error) {
v, err := b.PartialBuild()
if err != nil {
return nil, errors.Wrap(err, "error occurred during partial build")
}
if b.childBuilder == nil {
return nil, errors.New("no child builder present")
}
b.childBuilder.setParent(v)
return b.childBuilder.buildForRequest()
}
func (b *_RequestBuilder) MustBuild() Request {
build, err := b.Build()
if err != nil {
panic(err)
}
return build
}
func (b *_RequestBuilder) DeepCopy() any {
_copy := b.CreateRequestBuilder().(*_RequestBuilder)
_copy.childBuilder = b.childBuilder.DeepCopy().(_RequestChildBuilder)
_copy.childBuilder.setParent(_copy)
if b.err != nil {
_copy.err = b.err.DeepCopy().(*utils.MultiError)
}
return _copy
}
// CreateRequestBuilder creates a RequestBuilder
func (b *_Request) CreateRequestBuilder() RequestBuilder {
if b == nil {
return NewRequestBuilder()
}
return &_RequestBuilder{_Request: b.deepCopy()}
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Accessors for property fields.
///////////////////////
func (m *_Request) GetPeekedByte() RequestType {
return m.PeekedByte
}
func (m *_Request) GetStartingCR() *RequestType {
return m.StartingCR
}
func (m *_Request) GetResetMode() *RequestType {
return m.ResetMode
}
func (m *_Request) GetSecondPeek() RequestType {
return m.SecondPeek
}
func (m *_Request) GetTermination() RequestTermination {
return m.Termination
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Accessors for virtual fields.
///////////////////////
func (pm *_Request) GetActualPeek() RequestType {
m := pm._SubType
ctx := context.Background()
_ = ctx
startingCR := m.GetStartingCR()
_ = startingCR
resetMode := m.GetResetMode()
_ = resetMode
return CastRequestType(CastRequestType(utils.InlineIf(bool((bool(bool((m.GetStartingCR()) == (nil))) && bool(bool((m.GetResetMode()) == (nil))))) || bool((bool(bool(bool((m.GetStartingCR()) == (nil))) && bool(bool((m.GetResetMode()) != (nil)))) && bool(bool((m.GetSecondPeek()) == (RequestType_EMPTY))))), func() any { return CastRequestType(m.GetPeekedByte()) }, func() any { return CastRequestType(m.GetSecondPeek()) })))
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Deprecated: use the interface for direct cast
func CastRequest(structType any) Request {
if casted, ok := structType.(Request); ok {
return casted
}
if casted, ok := structType.(*Request); ok {
return *casted
}
return nil
}
func (m *_Request) GetTypeName() string {
return "Request"
}
func (m *_Request) getLengthInBits(ctx context.Context) uint16 {
lengthInBits := uint16(0)
// Optional Field (startingCR)
if m.StartingCR != nil {
lengthInBits += 8
}
// Optional Field (resetMode)
if m.ResetMode != nil {
lengthInBits += 8
}
// A virtual field doesn't have any in- or output.
// Simple field (termination)
lengthInBits += m.Termination.GetLengthInBits(ctx)
return lengthInBits
}
func (m *_Request) GetLengthInBits(ctx context.Context) uint16 {
return m._SubType.GetLengthInBits(ctx)
}
func (m *_Request) GetLengthInBytes(ctx context.Context) uint16 {
return m._SubType.GetLengthInBits(ctx) / 8
}
func RequestParse[T Request](ctx context.Context, theBytes []byte, cBusOptions CBusOptions) (T, error) {
return RequestParseWithBuffer[T](ctx, utils.NewReadBufferByteBased(theBytes), cBusOptions)
}
func RequestParseWithBufferProducer[T Request](cBusOptions CBusOptions) func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
v, err := RequestParseWithBuffer[T](ctx, readBuffer, cBusOptions)
if err != nil {
var zero T
return zero, err
}
return v, nil
}
}
func RequestParseWithBuffer[T Request](ctx context.Context, readBuffer utils.ReadBuffer, cBusOptions CBusOptions) (T, error) {
v, err := (&_Request{CBusOptions: cBusOptions}).parse(ctx, readBuffer, cBusOptions)
if err != nil {
var zero T
return zero, err
}
vc, ok := v.(T)
if !ok {
var zero T
return zero, errors.Errorf("Unexpected type %T. Expected type %T", v, *new(T))
}
return vc, nil
}
func (m *_Request) parse(ctx context.Context, readBuffer utils.ReadBuffer, cBusOptions CBusOptions) (__request Request, err error) {
positionAware := readBuffer
_ = positionAware
if pullErr := readBuffer.PullContext("Request"); pullErr != nil {
return nil, errors.Wrap(pullErr, "Error pulling for Request")
}
currentPos := positionAware.GetPos()
_ = currentPos
peekedByte, err := ReadPeekField[RequestType](ctx, "peekedByte", ReadEnum(RequestTypeByValue, ReadUnsignedByte(readBuffer, uint8(8))), 0)
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'peekedByte' field"))
}
m.PeekedByte = peekedByte
var startingCR *RequestType
startingCR, err = ReadOptionalField[RequestType](ctx, "startingCR", ReadEnum(RequestTypeByValue, ReadUnsignedByte(readBuffer, uint8(8))), bool((peekedByte) == (RequestType_EMPTY)))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'startingCR' field"))
}
m.StartingCR = startingCR
var resetMode *RequestType
resetMode, err = ReadOptionalField[RequestType](ctx, "resetMode", ReadEnum(RequestTypeByValue, ReadUnsignedByte(readBuffer, uint8(8))), bool((peekedByte) == (RequestType_RESET)))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'resetMode' field"))
}
m.ResetMode = resetMode
secondPeek, err := ReadPeekField[RequestType](ctx, "secondPeek", ReadEnum(RequestTypeByValue, ReadUnsignedByte(readBuffer, uint8(8))), 0)
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'secondPeek' field"))
}
m.SecondPeek = secondPeek
actualPeek, err := ReadVirtualField[RequestType](ctx, "actualPeek", (*RequestType)(nil), CastRequestType(utils.InlineIf(bool((bool(bool((startingCR) == (nil))) && bool(bool((resetMode) == (nil))))) || bool((bool(bool(bool((startingCR) == (nil))) && bool(bool((resetMode) != (nil)))) && bool(bool((secondPeek) == (RequestType_EMPTY))))), func() any { return CastRequestType(peekedByte) }, func() any { return CastRequestType(secondPeek) })))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'actualPeek' field"))
}
_ = actualPeek
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
var _child Request
switch {
case actualPeek == RequestType_SMART_CONNECT_SHORTCUT: // RequestSmartConnectShortcut
if _child, err = new(_RequestSmartConnectShortcut).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestSmartConnectShortcut for type-switch of Request")
}
case actualPeek == RequestType_RESET: // RequestReset
if _child, err = new(_RequestReset).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestReset for type-switch of Request")
}
case actualPeek == RequestType_DIRECT_COMMAND: // RequestDirectCommandAccess
if _child, err = new(_RequestDirectCommandAccess).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestDirectCommandAccess for type-switch of Request")
}
case actualPeek == RequestType_REQUEST_COMMAND: // RequestCommand
if _child, err = new(_RequestCommand).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestCommand for type-switch of Request")
}
case actualPeek == RequestType_NULL: // RequestNull
if _child, err = new(_RequestNull).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestNull for type-switch of Request")
}
case actualPeek == RequestType_EMPTY: // RequestEmpty
if _child, err = new(_RequestEmpty).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestEmpty for type-switch of Request")
}
case 0 == 0: // RequestObsolete
if _child, err = new(_RequestObsolete).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type RequestObsolete for type-switch of Request")
}
default:
return nil, errors.Errorf("Unmapped type for parameters [actualPeek=%v]", actualPeek)
}
termination, err := ReadSimpleField[RequestTermination](ctx, "termination", ReadComplex[RequestTermination](RequestTerminationParseWithBuffer, readBuffer))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'termination' field"))
}
m.Termination = termination
if closeErr := readBuffer.CloseContext("Request"); closeErr != nil {
return nil, errors.Wrap(closeErr, "Error closing for Request")
}
return _child, nil
}
func (pm *_Request) serializeParent(ctx context.Context, writeBuffer utils.WriteBuffer, child Request, serializeChildFunction func() error) error {
// We redirect all calls through client as some methods are only implemented there
m := child
_ = m
positionAware := writeBuffer
_ = positionAware
log := zerolog.Ctx(ctx)
_ = log
if pushErr := writeBuffer.PushContext("Request"); pushErr != nil {
return errors.Wrap(pushErr, "Error pushing for Request")
}
if err := WriteOptionalEnumField[RequestType](ctx, "startingCR", "RequestType", m.GetStartingCR(), WriteEnum[RequestType, uint8](RequestType.GetValue, RequestType.PLC4XEnumName, WriteUnsignedByte(writeBuffer, 8)), bool((m.GetPeekedByte()) == (RequestType_EMPTY))); err != nil {
return errors.Wrap(err, "Error serializing 'startingCR' field")
}
if err := WriteOptionalEnumField[RequestType](ctx, "resetMode", "RequestType", m.GetResetMode(), WriteEnum[RequestType, uint8](RequestType.GetValue, RequestType.PLC4XEnumName, WriteUnsignedByte(writeBuffer, 8)), bool((m.GetPeekedByte()) == (RequestType_RESET))); err != nil {
return errors.Wrap(err, "Error serializing 'resetMode' field")
}
// Virtual field
actualPeek := m.GetActualPeek()
_ = actualPeek
if _actualPeekErr := writeBuffer.WriteVirtual(ctx, "actualPeek", m.GetActualPeek()); _actualPeekErr != nil {
return errors.Wrap(_actualPeekErr, "Error serializing 'actualPeek' field")
}
// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
if _typeSwitchErr := serializeChildFunction(); _typeSwitchErr != nil {
return errors.Wrap(_typeSwitchErr, "Error serializing sub-type field")
}
if err := WriteSimpleField[RequestTermination](ctx, "termination", m.GetTermination(), WriteComplex[RequestTermination](writeBuffer)); err != nil {
return errors.Wrap(err, "Error serializing 'termination' field")
}
if popErr := writeBuffer.PopContext("Request"); popErr != nil {
return errors.Wrap(popErr, "Error popping for Request")
}
return nil
}
////
// Arguments Getter
func (m *_Request) GetCBusOptions() CBusOptions {
return m.CBusOptions
}
//
////
func (m *_Request) IsRequest() {}
func (m *_Request) DeepCopy() any {
return m.deepCopy()
}
func (m *_Request) deepCopy() *_Request {
if m == nil {
return nil
}
_RequestCopy := &_Request{
nil, // will be set by child
m.PeekedByte,
utils.CopyPtr[RequestType](m.StartingCR),
utils.CopyPtr[RequestType](m.ResetMode),
m.SecondPeek,
utils.DeepCopy[RequestTermination](m.Termination),
m.CBusOptions,
}
return _RequestCopy
}