internal override void Encode()

in src/Azure.IIoT.OpcUa/src/Encoders/PubSub/MonitoredItemMessage.cs [85:205]


        internal override void Encode(JsonEncoderEx encoder, string? publisherId, bool withHeader,
            string? property)
        {
            //
            // If not writing with samples header or writing to a property we fail. This is a
            // configuration error, rather than throwing constantly we just do not emit anything
            // instead.
            //
            if (!withHeader || property != null)
            {
                return;
            }

            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.NodeId))
            {
                encoder.WriteString(nameof(NodeId), NodeId);
            }
            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.EndpointUrl))
            {
                encoder.WriteString(nameof(EndpointUrl), EndpointUrl);
            }
            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ApplicationUri))
            {
                encoder.WriteString(nameof(ApplicationUri), ApplicationUri);
            }
            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.DisplayName) &&
                !string.IsNullOrEmpty(DisplayName))
            {
                encoder.WriteString(nameof(DisplayName), DisplayName);
            }
            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Timestamp))
            {
                encoder.WriteDateTime(nameof(Timestamp), Timestamp?.UtcDateTime ?? default);
            }

            var valuePayload = Value;
            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status))
            {
                var status = Status;
                if (status == null)
                {
                    status = valuePayload != null ?
                        Opc.Ua.StatusCode.IsNotGood(valuePayload.StatusCode) ?
                            valuePayload.StatusCode : Opc.Ua.StatusCodes.Good :
                       (Opc.Ua.StatusCode?)Opc.Ua.StatusCodes.BadNoData;
                }
                encoder.WriteString(nameof(Status), status.Value.AsString());
            }

            // Create a copy of the data value and update the timestamps and status
            var value = new Opc.Ua.DataValue(valuePayload?.WrappedValue ?? Opc.Ua.Variant.Null);
            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status) ||
                Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.StatusCode))
            {
                value.StatusCode = valuePayload?.StatusCode ?? Opc.Ua.StatusCodes.BadNoData;
            }

            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourceTimestamp))
            {
                value.SourceTimestamp = valuePayload?.SourceTimestamp ?? DateTime.MinValue;
                if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourcePicoSeconds))
                {
                    value.SourcePicoseconds = valuePayload?.SourcePicoseconds ?? 0;
                }
            }
            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerTimestamp))
            {
                value.ServerTimestamp = valuePayload?.ServerTimestamp ?? DateTime.MinValue;
                if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerPicoSeconds))
                {
                    value.ServerPicoseconds = valuePayload?.ServerPicoseconds ?? 0;
                }
            }

            var reversibleMode = encoder.UseReversibleEncoding;
            try
            {
                encoder.UseReversibleEncoding =
                    DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.ReversibleFieldEncoding);
                encoder.WriteDataValue(nameof(Value), value);
            }
            finally
            {
                encoder.UseReversibleEncoding = reversibleMode;
            }

            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.SequenceNumber))
            {
                encoder.WriteUInt32(nameof(SequenceNumber), SequenceNumber);
            }

            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ExtensionFields))
            {
                var extensionFields = (nameof(DataSetWriterId), DataSetWriterName)
                    .YieldReturn();
                if (publisherId != null)
                {
                    extensionFields = extensionFields
                        .Append((nameof(JsonNetworkMessage.PublisherId), publisherId));
                }
                if (WriterGroupId != null)
                {
                    extensionFields = extensionFields
                        .Append((nameof(WriterGroupId), WriterGroupId));
                }
                if (ExtensionFields != null)
                {
                    extensionFields = extensionFields.Concat(ExtensionFields
                        .Where(e => e.DataSetFieldName is
                            not (nameof(DataSetWriterId)) and
                            not (nameof(EndpointUrl)) and
                            not (nameof(ApplicationUri)) and
                            not (nameof(WriterGroupId)) and
                            not (nameof(JsonNetworkMessage.PublisherId)))
                        .Select(e => (e.DataSetFieldName, e.Value.Value?.ToString())));
                }

                // We already wrote application uri and endpoint uri, so do not write again
                encoder.WriteStringDictionary(nameof(ExtensionFields), extensionFields);
            }
        }