plc4go/protocols/cbus/readwrite/model/CBusPointToPointCommand.go (321 lines of code) (raw):
/*
* 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.
// CBusPointToPointCommand is the corresponding interface of CBusPointToPointCommand
type CBusPointToPointCommand interface {
CBusPointToPointCommandContract
CBusPointToPointCommandRequirements
fmt.Stringer
utils.LengthAware
utils.Serializable
utils.Copyable
// IsCBusPointToPointCommand is a marker method to prevent unintentional type checks (interfaces of same signature)
IsCBusPointToPointCommand()
// CreateBuilder creates a CBusPointToPointCommandBuilder
CreateCBusPointToPointCommandBuilder() CBusPointToPointCommandBuilder
}
// CBusPointToPointCommandContract provides a set of functions which can be overwritten by a sub struct
type CBusPointToPointCommandContract interface {
// GetBridgeAddressCountPeek returns BridgeAddressCountPeek (property field)
GetBridgeAddressCountPeek() uint16
// GetCalData returns CalData (property field)
GetCalData() CALData
// GetIsDirect returns IsDirect (virtual field)
GetIsDirect() bool
// GetCBusOptions() returns a parser argument
GetCBusOptions() CBusOptions
// IsCBusPointToPointCommand is a marker method to prevent unintentional type checks (interfaces of same signature)
IsCBusPointToPointCommand()
// CreateBuilder creates a CBusPointToPointCommandBuilder
CreateCBusPointToPointCommandBuilder() CBusPointToPointCommandBuilder
}
// CBusPointToPointCommandRequirements provides a set of functions which need to be implemented by a sub struct
type CBusPointToPointCommandRequirements interface {
GetLengthInBits(ctx context.Context) uint16
GetLengthInBytes(ctx context.Context) uint16
// GetIsDirect returns IsDirect (discriminator field)
GetIsDirect() bool
}
// _CBusPointToPointCommand is the data-structure of this message
type _CBusPointToPointCommand struct {
_SubType interface {
CBusPointToPointCommandContract
CBusPointToPointCommandRequirements
}
BridgeAddressCountPeek uint16
CalData CALData
// Arguments.
CBusOptions CBusOptions
}
var _ CBusPointToPointCommandContract = (*_CBusPointToPointCommand)(nil)
// NewCBusPointToPointCommand factory function for _CBusPointToPointCommand
func NewCBusPointToPointCommand(bridgeAddressCountPeek uint16, calData CALData, cBusOptions CBusOptions) *_CBusPointToPointCommand {
if calData == nil {
panic("calData of type CALData for CBusPointToPointCommand must not be nil")
}
return &_CBusPointToPointCommand{BridgeAddressCountPeek: bridgeAddressCountPeek, CalData: calData, CBusOptions: cBusOptions}
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Builder
///////////////////////
// CBusPointToPointCommandBuilder is a builder for CBusPointToPointCommand
type CBusPointToPointCommandBuilder interface {
utils.Copyable
// WithMandatoryFields adds all mandatory fields (convenience for using multiple builder calls)
WithMandatoryFields(bridgeAddressCountPeek uint16, calData CALData) CBusPointToPointCommandBuilder
// WithBridgeAddressCountPeek adds BridgeAddressCountPeek (property field)
WithBridgeAddressCountPeek(uint16) CBusPointToPointCommandBuilder
// WithCalData adds CalData (property field)
WithCalData(CALData) CBusPointToPointCommandBuilder
// WithCalDataBuilder adds CalData (property field) which is build by the builder
WithCalDataBuilder(func(CALDataBuilder) CALDataBuilder) CBusPointToPointCommandBuilder
// WithArgCBusOptions sets a parser argument
WithArgCBusOptions(CBusOptions) CBusPointToPointCommandBuilder
// AsCBusPointToPointCommandDirect converts this build to a subType of CBusPointToPointCommand. It is always possible to return to current builder using Done()
AsCBusPointToPointCommandDirect() CBusPointToPointCommandDirectBuilder
// AsCBusPointToPointCommandIndirect converts this build to a subType of CBusPointToPointCommand. It is always possible to return to current builder using Done()
AsCBusPointToPointCommandIndirect() CBusPointToPointCommandIndirectBuilder
// Build builds the CBusPointToPointCommand or returns an error if something is wrong
PartialBuild() (CBusPointToPointCommandContract, error)
// MustBuild does the same as Build but panics on error
PartialMustBuild() CBusPointToPointCommandContract
// Build builds the CBusPointToPointCommand or returns an error if something is wrong
Build() (CBusPointToPointCommand, error)
// MustBuild does the same as Build but panics on error
MustBuild() CBusPointToPointCommand
}
// NewCBusPointToPointCommandBuilder() creates a CBusPointToPointCommandBuilder
func NewCBusPointToPointCommandBuilder() CBusPointToPointCommandBuilder {
return &_CBusPointToPointCommandBuilder{_CBusPointToPointCommand: new(_CBusPointToPointCommand)}
}
type _CBusPointToPointCommandChildBuilder interface {
utils.Copyable
setParent(CBusPointToPointCommandContract)
buildForCBusPointToPointCommand() (CBusPointToPointCommand, error)
}
type _CBusPointToPointCommandBuilder struct {
*_CBusPointToPointCommand
childBuilder _CBusPointToPointCommandChildBuilder
err *utils.MultiError
}
var _ (CBusPointToPointCommandBuilder) = (*_CBusPointToPointCommandBuilder)(nil)
func (b *_CBusPointToPointCommandBuilder) WithMandatoryFields(bridgeAddressCountPeek uint16, calData CALData) CBusPointToPointCommandBuilder {
return b.WithBridgeAddressCountPeek(bridgeAddressCountPeek).WithCalData(calData)
}
func (b *_CBusPointToPointCommandBuilder) WithBridgeAddressCountPeek(bridgeAddressCountPeek uint16) CBusPointToPointCommandBuilder {
b.BridgeAddressCountPeek = bridgeAddressCountPeek
return b
}
func (b *_CBusPointToPointCommandBuilder) WithCalData(calData CALData) CBusPointToPointCommandBuilder {
b.CalData = calData
return b
}
func (b *_CBusPointToPointCommandBuilder) WithCalDataBuilder(builderSupplier func(CALDataBuilder) CALDataBuilder) CBusPointToPointCommandBuilder {
builder := builderSupplier(b.CalData.CreateCALDataBuilder())
var err error
b.CalData, 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, "CALDataBuilder failed"))
}
return b
}
func (b *_CBusPointToPointCommandBuilder) WithArgCBusOptions(cBusOptions CBusOptions) CBusPointToPointCommandBuilder {
b.CBusOptions = cBusOptions
return b
}
func (b *_CBusPointToPointCommandBuilder) PartialBuild() (CBusPointToPointCommandContract, error) {
if b.CalData == nil {
if b.err == nil {
b.err = new(utils.MultiError)
}
b.err.Append(errors.New("mandatory field 'calData' not set"))
}
if b.err != nil {
return nil, errors.Wrap(b.err, "error occurred during build")
}
return b._CBusPointToPointCommand.deepCopy(), nil
}
func (b *_CBusPointToPointCommandBuilder) PartialMustBuild() CBusPointToPointCommandContract {
build, err := b.PartialBuild()
if err != nil {
panic(err)
}
return build
}
func (b *_CBusPointToPointCommandBuilder) AsCBusPointToPointCommandDirect() CBusPointToPointCommandDirectBuilder {
if cb, ok := b.childBuilder.(CBusPointToPointCommandDirectBuilder); ok {
return cb
}
cb := NewCBusPointToPointCommandDirectBuilder().(*_CBusPointToPointCommandDirectBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_CBusPointToPointCommandBuilder) AsCBusPointToPointCommandIndirect() CBusPointToPointCommandIndirectBuilder {
if cb, ok := b.childBuilder.(CBusPointToPointCommandIndirectBuilder); ok {
return cb
}
cb := NewCBusPointToPointCommandIndirectBuilder().(*_CBusPointToPointCommandIndirectBuilder)
cb.parentBuilder = b
b.childBuilder = cb
return cb
}
func (b *_CBusPointToPointCommandBuilder) Build() (CBusPointToPointCommand, 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.buildForCBusPointToPointCommand()
}
func (b *_CBusPointToPointCommandBuilder) MustBuild() CBusPointToPointCommand {
build, err := b.Build()
if err != nil {
panic(err)
}
return build
}
func (b *_CBusPointToPointCommandBuilder) DeepCopy() any {
_copy := b.CreateCBusPointToPointCommandBuilder().(*_CBusPointToPointCommandBuilder)
_copy.childBuilder = b.childBuilder.DeepCopy().(_CBusPointToPointCommandChildBuilder)
_copy.childBuilder.setParent(_copy)
if b.err != nil {
_copy.err = b.err.DeepCopy().(*utils.MultiError)
}
return _copy
}
// CreateCBusPointToPointCommandBuilder creates a CBusPointToPointCommandBuilder
func (b *_CBusPointToPointCommand) CreateCBusPointToPointCommandBuilder() CBusPointToPointCommandBuilder {
if b == nil {
return NewCBusPointToPointCommandBuilder()
}
return &_CBusPointToPointCommandBuilder{_CBusPointToPointCommand: b.deepCopy()}
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Accessors for property fields.
///////////////////////
func (m *_CBusPointToPointCommand) GetBridgeAddressCountPeek() uint16 {
return m.BridgeAddressCountPeek
}
func (m *_CBusPointToPointCommand) GetCalData() CALData {
return m.CalData
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/////////////////////// Accessors for virtual fields.
///////////////////////
func (pm *_CBusPointToPointCommand) GetIsDirect() bool {
m := pm._SubType
ctx := context.Background()
_ = ctx
return bool(bool((m.GetBridgeAddressCountPeek() & 0x00FF) == (0x0000)))
}
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Deprecated: use the interface for direct cast
func CastCBusPointToPointCommand(structType any) CBusPointToPointCommand {
if casted, ok := structType.(CBusPointToPointCommand); ok {
return casted
}
if casted, ok := structType.(*CBusPointToPointCommand); ok {
return *casted
}
return nil
}
func (m *_CBusPointToPointCommand) GetTypeName() string {
return "CBusPointToPointCommand"
}
func (m *_CBusPointToPointCommand) getLengthInBits(ctx context.Context) uint16 {
lengthInBits := uint16(0)
// A virtual field doesn't have any in- or output.
// Simple field (calData)
lengthInBits += m.CalData.GetLengthInBits(ctx)
return lengthInBits
}
func (m *_CBusPointToPointCommand) GetLengthInBits(ctx context.Context) uint16 {
return m._SubType.GetLengthInBits(ctx)
}
func (m *_CBusPointToPointCommand) GetLengthInBytes(ctx context.Context) uint16 {
return m._SubType.GetLengthInBits(ctx) / 8
}
func CBusPointToPointCommandParse[T CBusPointToPointCommand](ctx context.Context, theBytes []byte, cBusOptions CBusOptions) (T, error) {
return CBusPointToPointCommandParseWithBuffer[T](ctx, utils.NewReadBufferByteBased(theBytes), cBusOptions)
}
func CBusPointToPointCommandParseWithBufferProducer[T CBusPointToPointCommand](cBusOptions CBusOptions) func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
v, err := CBusPointToPointCommandParseWithBuffer[T](ctx, readBuffer, cBusOptions)
if err != nil {
var zero T
return zero, err
}
return v, nil
}
}
func CBusPointToPointCommandParseWithBuffer[T CBusPointToPointCommand](ctx context.Context, readBuffer utils.ReadBuffer, cBusOptions CBusOptions) (T, error) {
v, err := (&_CBusPointToPointCommand{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 *_CBusPointToPointCommand) parse(ctx context.Context, readBuffer utils.ReadBuffer, cBusOptions CBusOptions) (__cBusPointToPointCommand CBusPointToPointCommand, err error) {
positionAware := readBuffer
_ = positionAware
if pullErr := readBuffer.PullContext("CBusPointToPointCommand"); pullErr != nil {
return nil, errors.Wrap(pullErr, "Error pulling for CBusPointToPointCommand")
}
currentPos := positionAware.GetPos()
_ = currentPos
bridgeAddressCountPeek, err := ReadPeekField[uint16](ctx, "bridgeAddressCountPeek", ReadUnsignedShort(readBuffer, uint8(16)), 0)
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'bridgeAddressCountPeek' field"))
}
m.BridgeAddressCountPeek = bridgeAddressCountPeek
isDirect, err := ReadVirtualField[bool](ctx, "isDirect", (*bool)(nil), bool((bridgeAddressCountPeek&0x00FF) == (0x0000)))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'isDirect' field"))
}
_ = isDirect
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
var _child CBusPointToPointCommand
switch {
case isDirect == bool(true): // CBusPointToPointCommandDirect
if _child, err = new(_CBusPointToPointCommandDirect).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type CBusPointToPointCommandDirect for type-switch of CBusPointToPointCommand")
}
case isDirect == bool(false): // CBusPointToPointCommandIndirect
if _child, err = new(_CBusPointToPointCommandIndirect).parse(ctx, readBuffer, m, cBusOptions); err != nil {
return nil, errors.Wrap(err, "Error parsing sub-type CBusPointToPointCommandIndirect for type-switch of CBusPointToPointCommand")
}
default:
return nil, errors.Errorf("Unmapped type for parameters [isDirect=%v]", isDirect)
}
calData, err := ReadSimpleField[CALData](ctx, "calData", ReadComplex[CALData](CALDataParseWithBufferProducer[CALData]((RequestContext)(nil)), readBuffer))
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'calData' field"))
}
m.CalData = calData
if closeErr := readBuffer.CloseContext("CBusPointToPointCommand"); closeErr != nil {
return nil, errors.Wrap(closeErr, "Error closing for CBusPointToPointCommand")
}
return _child, nil
}
func (pm *_CBusPointToPointCommand) serializeParent(ctx context.Context, writeBuffer utils.WriteBuffer, child CBusPointToPointCommand, 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("CBusPointToPointCommand"); pushErr != nil {
return errors.Wrap(pushErr, "Error pushing for CBusPointToPointCommand")
}
// Virtual field
isDirect := m.GetIsDirect()
_ = isDirect
if _isDirectErr := writeBuffer.WriteVirtual(ctx, "isDirect", m.GetIsDirect()); _isDirectErr != nil {
return errors.Wrap(_isDirectErr, "Error serializing 'isDirect' 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[CALData](ctx, "calData", m.GetCalData(), WriteComplex[CALData](writeBuffer)); err != nil {
return errors.Wrap(err, "Error serializing 'calData' field")
}
if popErr := writeBuffer.PopContext("CBusPointToPointCommand"); popErr != nil {
return errors.Wrap(popErr, "Error popping for CBusPointToPointCommand")
}
return nil
}
////
// Arguments Getter
func (m *_CBusPointToPointCommand) GetCBusOptions() CBusOptions {
return m.CBusOptions
}
//
////
func (m *_CBusPointToPointCommand) IsCBusPointToPointCommand() {}
func (m *_CBusPointToPointCommand) DeepCopy() any {
return m.deepCopy()
}
func (m *_CBusPointToPointCommand) deepCopy() *_CBusPointToPointCommand {
if m == nil {
return nil
}
_CBusPointToPointCommandCopy := &_CBusPointToPointCommand{
nil, // will be set by child
m.BridgeAddressCountPeek,
utils.DeepCopy[CALData](m.CalData),
m.CBusOptions,
}
return _CBusPointToPointCommandCopy
}