plc4go/protocols/opcua/readwrite/model/Variant.go (665 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. // Variant is the corresponding interface of Variant type Variant interface { VariantContract VariantRequirements fmt.Stringer utils.LengthAware utils.Serializable utils.Copyable // IsVariant is a marker method to prevent unintentional type checks (interfaces of same signature) IsVariant() // CreateBuilder creates a VariantBuilder CreateVariantBuilder() VariantBuilder } // VariantContract provides a set of functions which can be overwritten by a sub struct type VariantContract interface { // GetArrayLengthSpecified returns ArrayLengthSpecified (property field) GetArrayLengthSpecified() bool // GetArrayDimensionsSpecified returns ArrayDimensionsSpecified (property field) GetArrayDimensionsSpecified() bool // GetNoOfArrayDimensions returns NoOfArrayDimensions (property field) GetNoOfArrayDimensions() *int32 // GetArrayDimensions returns ArrayDimensions (property field) GetArrayDimensions() []bool // IsVariant is a marker method to prevent unintentional type checks (interfaces of same signature) IsVariant() // CreateBuilder creates a VariantBuilder CreateVariantBuilder() VariantBuilder } // VariantRequirements provides a set of functions which need to be implemented by a sub struct type VariantRequirements interface { GetLengthInBits(ctx context.Context) uint16 GetLengthInBytes(ctx context.Context) uint16 // GetVariantType returns VariantType (discriminator field) GetVariantType() uint8 // GetArrayLengthSpecified returns ArrayLengthSpecified (discriminator field) GetArrayLengthSpecified() bool } // _Variant is the data-structure of this message type _Variant struct { _SubType interface { VariantContract VariantRequirements } ArrayLengthSpecified bool ArrayDimensionsSpecified bool NoOfArrayDimensions *int32 ArrayDimensions []bool } var _ VariantContract = (*_Variant)(nil) // NewVariant factory function for _Variant func NewVariant(arrayLengthSpecified bool, arrayDimensionsSpecified bool, noOfArrayDimensions *int32, arrayDimensions []bool) *_Variant { return &_Variant{ArrayLengthSpecified: arrayLengthSpecified, ArrayDimensionsSpecified: arrayDimensionsSpecified, NoOfArrayDimensions: noOfArrayDimensions, ArrayDimensions: arrayDimensions} } /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////// Builder /////////////////////// // VariantBuilder is a builder for Variant type VariantBuilder interface { utils.Copyable // WithMandatoryFields adds all mandatory fields (convenience for using multiple builder calls) WithMandatoryFields(arrayLengthSpecified bool, arrayDimensionsSpecified bool, arrayDimensions []bool) VariantBuilder // WithArrayLengthSpecified adds ArrayLengthSpecified (property field) WithArrayLengthSpecified(bool) VariantBuilder // WithArrayDimensionsSpecified adds ArrayDimensionsSpecified (property field) WithArrayDimensionsSpecified(bool) VariantBuilder // WithNoOfArrayDimensions adds NoOfArrayDimensions (property field) WithOptionalNoOfArrayDimensions(int32) VariantBuilder // WithArrayDimensions adds ArrayDimensions (property field) WithArrayDimensions(...bool) VariantBuilder // AsVariantNull converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantNull() VariantNullBuilder // AsVariantBoolean converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantBoolean() VariantBooleanBuilder // AsVariantSByte converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantSByte() VariantSByteBuilder // AsVariantByte converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantByte() VariantByteBuilder // AsVariantInt16 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantInt16() VariantInt16Builder // AsVariantUInt16 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantUInt16() VariantUInt16Builder // AsVariantInt32 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantInt32() VariantInt32Builder // AsVariantUInt32 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantUInt32() VariantUInt32Builder // AsVariantInt64 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantInt64() VariantInt64Builder // AsVariantUInt64 converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantUInt64() VariantUInt64Builder // AsVariantFloat converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantFloat() VariantFloatBuilder // AsVariantDouble converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantDouble() VariantDoubleBuilder // AsVariantString converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantString() VariantStringBuilder // AsVariantDateTime converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantDateTime() VariantDateTimeBuilder // AsVariantGuid converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantGuid() VariantGuidBuilder // AsVariantByteString converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantByteString() VariantByteStringBuilder // AsVariantXmlElement converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantXmlElement() VariantXmlElementBuilder // AsVariantNodeId converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantNodeId() VariantNodeIdBuilder // AsVariantExpandedNodeId converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantExpandedNodeId() VariantExpandedNodeIdBuilder // AsVariantStatusCode converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantStatusCode() VariantStatusCodeBuilder // AsVariantQualifiedName converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantQualifiedName() VariantQualifiedNameBuilder // AsVariantLocalizedText converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantLocalizedText() VariantLocalizedTextBuilder // AsVariantExtensionObject converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantExtensionObject() VariantExtensionObjectBuilder // AsVariantDataValue converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantDataValue() VariantDataValueBuilder // AsVariantVariant converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantVariant() VariantVariantBuilder // AsVariantDiagnosticInfo converts this build to a subType of Variant. It is always possible to return to current builder using Done() AsVariantDiagnosticInfo() VariantDiagnosticInfoBuilder // Build builds the Variant or returns an error if something is wrong PartialBuild() (VariantContract, error) // MustBuild does the same as Build but panics on error PartialMustBuild() VariantContract // Build builds the Variant or returns an error if something is wrong Build() (Variant, error) // MustBuild does the same as Build but panics on error MustBuild() Variant } // NewVariantBuilder() creates a VariantBuilder func NewVariantBuilder() VariantBuilder { return &_VariantBuilder{_Variant: new(_Variant)} } type _VariantChildBuilder interface { utils.Copyable setParent(VariantContract) buildForVariant() (Variant, error) } type _VariantBuilder struct { *_Variant childBuilder _VariantChildBuilder err *utils.MultiError } var _ (VariantBuilder) = (*_VariantBuilder)(nil) func (b *_VariantBuilder) WithMandatoryFields(arrayLengthSpecified bool, arrayDimensionsSpecified bool, arrayDimensions []bool) VariantBuilder { return b.WithArrayLengthSpecified(arrayLengthSpecified).WithArrayDimensionsSpecified(arrayDimensionsSpecified).WithArrayDimensions(arrayDimensions...) } func (b *_VariantBuilder) WithArrayLengthSpecified(arrayLengthSpecified bool) VariantBuilder { b.ArrayLengthSpecified = arrayLengthSpecified return b } func (b *_VariantBuilder) WithArrayDimensionsSpecified(arrayDimensionsSpecified bool) VariantBuilder { b.ArrayDimensionsSpecified = arrayDimensionsSpecified return b } func (b *_VariantBuilder) WithOptionalNoOfArrayDimensions(noOfArrayDimensions int32) VariantBuilder { b.NoOfArrayDimensions = &noOfArrayDimensions return b } func (b *_VariantBuilder) WithArrayDimensions(arrayDimensions ...bool) VariantBuilder { b.ArrayDimensions = arrayDimensions return b } func (b *_VariantBuilder) PartialBuild() (VariantContract, error) { if b.err != nil { return nil, errors.Wrap(b.err, "error occurred during build") } return b._Variant.deepCopy(), nil } func (b *_VariantBuilder) PartialMustBuild() VariantContract { build, err := b.PartialBuild() if err != nil { panic(err) } return build } func (b *_VariantBuilder) AsVariantNull() VariantNullBuilder { if cb, ok := b.childBuilder.(VariantNullBuilder); ok { return cb } cb := NewVariantNullBuilder().(*_VariantNullBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantBoolean() VariantBooleanBuilder { if cb, ok := b.childBuilder.(VariantBooleanBuilder); ok { return cb } cb := NewVariantBooleanBuilder().(*_VariantBooleanBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantSByte() VariantSByteBuilder { if cb, ok := b.childBuilder.(VariantSByteBuilder); ok { return cb } cb := NewVariantSByteBuilder().(*_VariantSByteBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantByte() VariantByteBuilder { if cb, ok := b.childBuilder.(VariantByteBuilder); ok { return cb } cb := NewVariantByteBuilder().(*_VariantByteBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantInt16() VariantInt16Builder { if cb, ok := b.childBuilder.(VariantInt16Builder); ok { return cb } cb := NewVariantInt16Builder().(*_VariantInt16Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantUInt16() VariantUInt16Builder { if cb, ok := b.childBuilder.(VariantUInt16Builder); ok { return cb } cb := NewVariantUInt16Builder().(*_VariantUInt16Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantInt32() VariantInt32Builder { if cb, ok := b.childBuilder.(VariantInt32Builder); ok { return cb } cb := NewVariantInt32Builder().(*_VariantInt32Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantUInt32() VariantUInt32Builder { if cb, ok := b.childBuilder.(VariantUInt32Builder); ok { return cb } cb := NewVariantUInt32Builder().(*_VariantUInt32Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantInt64() VariantInt64Builder { if cb, ok := b.childBuilder.(VariantInt64Builder); ok { return cb } cb := NewVariantInt64Builder().(*_VariantInt64Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantUInt64() VariantUInt64Builder { if cb, ok := b.childBuilder.(VariantUInt64Builder); ok { return cb } cb := NewVariantUInt64Builder().(*_VariantUInt64Builder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantFloat() VariantFloatBuilder { if cb, ok := b.childBuilder.(VariantFloatBuilder); ok { return cb } cb := NewVariantFloatBuilder().(*_VariantFloatBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantDouble() VariantDoubleBuilder { if cb, ok := b.childBuilder.(VariantDoubleBuilder); ok { return cb } cb := NewVariantDoubleBuilder().(*_VariantDoubleBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantString() VariantStringBuilder { if cb, ok := b.childBuilder.(VariantStringBuilder); ok { return cb } cb := NewVariantStringBuilder().(*_VariantStringBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantDateTime() VariantDateTimeBuilder { if cb, ok := b.childBuilder.(VariantDateTimeBuilder); ok { return cb } cb := NewVariantDateTimeBuilder().(*_VariantDateTimeBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantGuid() VariantGuidBuilder { if cb, ok := b.childBuilder.(VariantGuidBuilder); ok { return cb } cb := NewVariantGuidBuilder().(*_VariantGuidBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantByteString() VariantByteStringBuilder { if cb, ok := b.childBuilder.(VariantByteStringBuilder); ok { return cb } cb := NewVariantByteStringBuilder().(*_VariantByteStringBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantXmlElement() VariantXmlElementBuilder { if cb, ok := b.childBuilder.(VariantXmlElementBuilder); ok { return cb } cb := NewVariantXmlElementBuilder().(*_VariantXmlElementBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantNodeId() VariantNodeIdBuilder { if cb, ok := b.childBuilder.(VariantNodeIdBuilder); ok { return cb } cb := NewVariantNodeIdBuilder().(*_VariantNodeIdBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantExpandedNodeId() VariantExpandedNodeIdBuilder { if cb, ok := b.childBuilder.(VariantExpandedNodeIdBuilder); ok { return cb } cb := NewVariantExpandedNodeIdBuilder().(*_VariantExpandedNodeIdBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantStatusCode() VariantStatusCodeBuilder { if cb, ok := b.childBuilder.(VariantStatusCodeBuilder); ok { return cb } cb := NewVariantStatusCodeBuilder().(*_VariantStatusCodeBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantQualifiedName() VariantQualifiedNameBuilder { if cb, ok := b.childBuilder.(VariantQualifiedNameBuilder); ok { return cb } cb := NewVariantQualifiedNameBuilder().(*_VariantQualifiedNameBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantLocalizedText() VariantLocalizedTextBuilder { if cb, ok := b.childBuilder.(VariantLocalizedTextBuilder); ok { return cb } cb := NewVariantLocalizedTextBuilder().(*_VariantLocalizedTextBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantExtensionObject() VariantExtensionObjectBuilder { if cb, ok := b.childBuilder.(VariantExtensionObjectBuilder); ok { return cb } cb := NewVariantExtensionObjectBuilder().(*_VariantExtensionObjectBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantDataValue() VariantDataValueBuilder { if cb, ok := b.childBuilder.(VariantDataValueBuilder); ok { return cb } cb := NewVariantDataValueBuilder().(*_VariantDataValueBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantVariant() VariantVariantBuilder { if cb, ok := b.childBuilder.(VariantVariantBuilder); ok { return cb } cb := NewVariantVariantBuilder().(*_VariantVariantBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) AsVariantDiagnosticInfo() VariantDiagnosticInfoBuilder { if cb, ok := b.childBuilder.(VariantDiagnosticInfoBuilder); ok { return cb } cb := NewVariantDiagnosticInfoBuilder().(*_VariantDiagnosticInfoBuilder) cb.parentBuilder = b b.childBuilder = cb return cb } func (b *_VariantBuilder) Build() (Variant, 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.buildForVariant() } func (b *_VariantBuilder) MustBuild() Variant { build, err := b.Build() if err != nil { panic(err) } return build } func (b *_VariantBuilder) DeepCopy() any { _copy := b.CreateVariantBuilder().(*_VariantBuilder) _copy.childBuilder = b.childBuilder.DeepCopy().(_VariantChildBuilder) _copy.childBuilder.setParent(_copy) if b.err != nil { _copy.err = b.err.DeepCopy().(*utils.MultiError) } return _copy } // CreateVariantBuilder creates a VariantBuilder func (b *_Variant) CreateVariantBuilder() VariantBuilder { if b == nil { return NewVariantBuilder() } return &_VariantBuilder{_Variant: b.deepCopy()} } /////////////////////// /////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////// Accessors for property fields. /////////////////////// func (m *_Variant) GetArrayLengthSpecified() bool { return m.ArrayLengthSpecified } func (m *_Variant) GetArrayDimensionsSpecified() bool { return m.ArrayDimensionsSpecified } func (m *_Variant) GetNoOfArrayDimensions() *int32 { return m.NoOfArrayDimensions } func (m *_Variant) GetArrayDimensions() []bool { return m.ArrayDimensions } /////////////////////// /////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// // Deprecated: use the interface for direct cast func CastVariant(structType any) Variant { if casted, ok := structType.(Variant); ok { return casted } if casted, ok := structType.(*Variant); ok { return *casted } return nil } func (m *_Variant) GetTypeName() string { return "Variant" } func (m *_Variant) getLengthInBits(ctx context.Context) uint16 { lengthInBits := uint16(0) // Simple field (arrayLengthSpecified) lengthInBits += 1 // Simple field (arrayDimensionsSpecified) lengthInBits += 1 // Discriminator Field (VariantType) lengthInBits += 6 // Optional Field (noOfArrayDimensions) if m.NoOfArrayDimensions != nil { lengthInBits += 32 } // Array field if len(m.ArrayDimensions) > 0 { lengthInBits += 1 * uint16(len(m.ArrayDimensions)) } return lengthInBits } func (m *_Variant) GetLengthInBits(ctx context.Context) uint16 { return m._SubType.GetLengthInBits(ctx) } func (m *_Variant) GetLengthInBytes(ctx context.Context) uint16 { return m._SubType.GetLengthInBits(ctx) / 8 } func VariantParse[T Variant](ctx context.Context, theBytes []byte) (T, error) { return VariantParseWithBuffer[T](ctx, utils.NewReadBufferByteBased(theBytes)) } func VariantParseWithBufferProducer[T Variant]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) { return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) { v, err := VariantParseWithBuffer[T](ctx, readBuffer) if err != nil { var zero T return zero, err } return v, nil } } func VariantParseWithBuffer[T Variant](ctx context.Context, readBuffer utils.ReadBuffer) (T, error) { v, err := (&_Variant{}).parse(ctx, readBuffer) 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 *_Variant) parse(ctx context.Context, readBuffer utils.ReadBuffer) (__variant Variant, err error) { positionAware := readBuffer _ = positionAware if pullErr := readBuffer.PullContext("Variant"); pullErr != nil { return nil, errors.Wrap(pullErr, "Error pulling for Variant") } currentPos := positionAware.GetPos() _ = currentPos arrayLengthSpecified, err := ReadSimpleField(ctx, "arrayLengthSpecified", ReadBoolean(readBuffer)) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayLengthSpecified' field")) } m.ArrayLengthSpecified = arrayLengthSpecified arrayDimensionsSpecified, err := ReadSimpleField(ctx, "arrayDimensionsSpecified", ReadBoolean(readBuffer)) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayDimensionsSpecified' field")) } m.ArrayDimensionsSpecified = arrayDimensionsSpecified VariantType, err := ReadDiscriminatorField[uint8](ctx, "VariantType", ReadUnsignedByte(readBuffer, uint8(6))) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'VariantType' field")) } // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) var _child Variant switch { case VariantType == uint8(0): // VariantNull if _child, err = new(_VariantNull).parse(ctx, readBuffer, m); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantNull for type-switch of Variant") } case VariantType == uint8(1): // VariantBoolean if _child, err = new(_VariantBoolean).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantBoolean for type-switch of Variant") } case VariantType == uint8(2): // VariantSByte if _child, err = new(_VariantSByte).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantSByte for type-switch of Variant") } case VariantType == uint8(3): // VariantByte if _child, err = new(_VariantByte).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantByte for type-switch of Variant") } case VariantType == uint8(4): // VariantInt16 if _child, err = new(_VariantInt16).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantInt16 for type-switch of Variant") } case VariantType == uint8(5): // VariantUInt16 if _child, err = new(_VariantUInt16).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantUInt16 for type-switch of Variant") } case VariantType == uint8(6): // VariantInt32 if _child, err = new(_VariantInt32).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantInt32 for type-switch of Variant") } case VariantType == uint8(7): // VariantUInt32 if _child, err = new(_VariantUInt32).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantUInt32 for type-switch of Variant") } case VariantType == uint8(8): // VariantInt64 if _child, err = new(_VariantInt64).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantInt64 for type-switch of Variant") } case VariantType == uint8(9): // VariantUInt64 if _child, err = new(_VariantUInt64).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantUInt64 for type-switch of Variant") } case VariantType == uint8(10): // VariantFloat if _child, err = new(_VariantFloat).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantFloat for type-switch of Variant") } case VariantType == uint8(11): // VariantDouble if _child, err = new(_VariantDouble).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantDouble for type-switch of Variant") } case VariantType == uint8(12): // VariantString if _child, err = new(_VariantString).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantString for type-switch of Variant") } case VariantType == uint8(13): // VariantDateTime if _child, err = new(_VariantDateTime).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantDateTime for type-switch of Variant") } case VariantType == uint8(14): // VariantGuid if _child, err = new(_VariantGuid).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantGuid for type-switch of Variant") } case VariantType == uint8(15): // VariantByteString if _child, err = new(_VariantByteString).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantByteString for type-switch of Variant") } case VariantType == uint8(16): // VariantXmlElement if _child, err = new(_VariantXmlElement).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantXmlElement for type-switch of Variant") } case VariantType == uint8(17): // VariantNodeId if _child, err = new(_VariantNodeId).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantNodeId for type-switch of Variant") } case VariantType == uint8(18): // VariantExpandedNodeId if _child, err = new(_VariantExpandedNodeId).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantExpandedNodeId for type-switch of Variant") } case VariantType == uint8(19): // VariantStatusCode if _child, err = new(_VariantStatusCode).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantStatusCode for type-switch of Variant") } case VariantType == uint8(20): // VariantQualifiedName if _child, err = new(_VariantQualifiedName).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantQualifiedName for type-switch of Variant") } case VariantType == uint8(21): // VariantLocalizedText if _child, err = new(_VariantLocalizedText).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantLocalizedText for type-switch of Variant") } case VariantType == uint8(22): // VariantExtensionObject if _child, err = new(_VariantExtensionObject).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantExtensionObject for type-switch of Variant") } case VariantType == uint8(23): // VariantDataValue if _child, err = new(_VariantDataValue).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantDataValue for type-switch of Variant") } case VariantType == uint8(24): // VariantVariant if _child, err = new(_VariantVariant).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantVariant for type-switch of Variant") } case VariantType == uint8(25): // VariantDiagnosticInfo if _child, err = new(_VariantDiagnosticInfo).parse(ctx, readBuffer, m, arrayLengthSpecified); err != nil { return nil, errors.Wrap(err, "Error parsing sub-type VariantDiagnosticInfo for type-switch of Variant") } default: return nil, errors.Errorf("Unmapped type for parameters [VariantType=%v, arrayLengthSpecified=%v]", VariantType, arrayLengthSpecified) } var noOfArrayDimensions *int32 noOfArrayDimensions, err = ReadOptionalField[int32](ctx, "noOfArrayDimensions", ReadSignedInt(readBuffer, uint8(32)), arrayDimensionsSpecified) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'noOfArrayDimensions' field")) } m.NoOfArrayDimensions = noOfArrayDimensions arrayDimensions, err := ReadCountArrayField[bool](ctx, "arrayDimensions", ReadBoolean(readBuffer), uint64(utils.InlineIf(bool((noOfArrayDimensions) == (nil)), func() any { return int32(int32(0)) }, func() any { return int32((*noOfArrayDimensions)) }).(int32))) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayDimensions' field")) } m.ArrayDimensions = arrayDimensions if closeErr := readBuffer.CloseContext("Variant"); closeErr != nil { return nil, errors.Wrap(closeErr, "Error closing for Variant") } return _child, nil } func (pm *_Variant) serializeParent(ctx context.Context, writeBuffer utils.WriteBuffer, child Variant, 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("Variant"); pushErr != nil { return errors.Wrap(pushErr, "Error pushing for Variant") } if err := WriteSimpleField[bool](ctx, "arrayLengthSpecified", m.GetArrayLengthSpecified(), WriteBoolean(writeBuffer)); err != nil { return errors.Wrap(err, "Error serializing 'arrayLengthSpecified' field") } if err := WriteSimpleField[bool](ctx, "arrayDimensionsSpecified", m.GetArrayDimensionsSpecified(), WriteBoolean(writeBuffer)); err != nil { return errors.Wrap(err, "Error serializing 'arrayDimensionsSpecified' field") } if err := WriteDiscriminatorField(ctx, "VariantType", m.GetVariantType(), WriteUnsignedByte(writeBuffer, 6)); err != nil { return errors.Wrap(err, "Error serializing 'VariantType' 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 := WriteOptionalField[int32](ctx, "noOfArrayDimensions", m.GetNoOfArrayDimensions(), WriteSignedInt(writeBuffer, 32), true); err != nil { return errors.Wrap(err, "Error serializing 'noOfArrayDimensions' field") } if err := WriteSimpleTypeArrayField(ctx, "arrayDimensions", m.GetArrayDimensions(), WriteBoolean(writeBuffer)); err != nil { return errors.Wrap(err, "Error serializing 'arrayDimensions' field") } if popErr := writeBuffer.PopContext("Variant"); popErr != nil { return errors.Wrap(popErr, "Error popping for Variant") } return nil } func (m *_Variant) IsVariant() {} func (m *_Variant) DeepCopy() any { return m.deepCopy() } func (m *_Variant) deepCopy() *_Variant { if m == nil { return nil } _VariantCopy := &_Variant{ nil, // will be set by child m.ArrayLengthSpecified, m.ArrayDimensionsSpecified, utils.CopyPtr[int32](m.NoOfArrayDimensions), utils.DeepCopySlice[bool, bool](m.ArrayDimensions), } return _VariantCopy }