Encode more BEJ data types

This patch add encoding support for bejString, bejReal, bejBool and
bejPropertyAnnotation types.

Signed-off-by: Kasun Athukorala <kasunath@google.com>
Change-Id: I5c7dc302dfd4e374f792f2eee643f4adaac7e1f9
diff --git a/src/bej_encoder_core.c b/src/bej_encoder_core.c
index a4ca935..f1134f1 100644
--- a/src/bej_encoder_core.c
+++ b/src/bej_encoder_core.c
@@ -90,6 +90,79 @@
     return bejEncodeNnint(node->enumValueSeq, output);
 }
 
+int bejEncodeBejString(struct RedfishPropertyLeafString* node,
+                       struct BejEncoderOutputHandler* output)
+{
+    // S: Encode Sequence number.
+    RETURN_IF_IERROR(
+        bejEncodeNnint(node->leaf.metaData.sequenceNumber, output));
+    // F: Add the format.
+    RETURN_IF_IERROR(bejEncodeFormat(&node->leaf.nodeAttr.format, output));
+    // L: Encode the value length.
+    RETURN_IF_IERROR(bejEncodeNnint(node->leaf.metaData.vSize, output));
+    // V: Encode the value.
+    return output->recvOutput((void*)node->value, node->leaf.metaData.vSize,
+                              output->handlerContext);
+}
+
+int bejEncodeBejReal(struct RedfishPropertyLeafReal* node,
+                     struct BejEncoderOutputHandler* output)
+{
+    // S: Encode Sequence number.
+    RETURN_IF_IERROR(
+        bejEncodeNnint(node->leaf.metaData.sequenceNumber, output));
+    // F: Add the format.
+    RETURN_IF_IERROR(bejEncodeFormat(&node->leaf.nodeAttr.format, output));
+    // L: Encode the value length.
+    RETURN_IF_IERROR(bejEncodeNnint(node->leaf.metaData.vSize, output));
+    // V: Encode the value.
+    // Length of the "whole" value as nnint.
+    RETURN_IF_IERROR(
+        bejEncodeNnint(bejIntLengthOfValue(node->bejReal.whole), output));
+    // Add the "whole" value.
+    RETURN_IF_IERROR(bejEncodeInteger(node->bejReal.whole, output));
+    // Leading zero count as a nnint.
+    RETURN_IF_IERROR(bejEncodeNnint(node->bejReal.zeroCount, output));
+    // Fraction as a nnint.
+    RETURN_IF_IERROR(bejEncodeNnint(node->bejReal.fract, output));
+    // Exp length as a nnint.
+    RETURN_IF_IERROR(bejEncodeNnint(node->bejReal.expLen, output));
+    if (node->bejReal.expLen > 0)
+    {
+        // Exp length as a nnint.
+        RETURN_IF_IERROR(bejEncodeNnint(node->bejReal.expLen, output));
+        RETURN_IF_IERROR(bejEncodeInteger(node->bejReal.exp, output));
+    }
+    return 0;
+}
+
+int bejEncodeBejBool(struct RedfishPropertyLeafBool* node,
+                     struct BejEncoderOutputHandler* output)
+{
+    // S: Encode Sequence number.
+    RETURN_IF_IERROR(
+        bejEncodeNnint(node->leaf.metaData.sequenceNumber, output));
+    // F: Add the format.
+    RETURN_IF_IERROR(bejEncodeFormat(&node->leaf.nodeAttr.format, output));
+    // L: Encode the value length.
+    RETURN_IF_IERROR(bejEncodeNnint(node->leaf.metaData.vSize, output));
+    // V: Encode the value.
+    uint8_t value = node->value ? 0xFF : 0x00;
+    return output->recvOutput(&value, /*data_size=*/sizeof(uint8_t),
+                              output->handlerContext);
+}
+
+int bejEncodeBejProAnno(struct RedfishPropertyParent* node,
+                        struct BejEncoderOutputHandler* output)
+{
+    // Encode Sequence number.
+    RETURN_IF_IERROR(bejEncodeNnint(node->metaData.sequenceNumber, output));
+    // Add the format.
+    RETURN_IF_IERROR(bejEncodeFormat(&node->nodeAttr.format, output));
+    // Encode the value length.
+    return bejEncodeNnint(node->metaData.vSize, output);
+}
+
 /**
  * @brief Encode a BejNull type.
  */
@@ -128,6 +201,18 @@
         case bejEnum:
             RETURN_IF_IERROR(bejEncodeBejEnum(node, output));
             break;
+        case bejString:
+            RETURN_IF_IERROR(bejEncodeBejString(node, output));
+            break;
+        case bejReal:
+            RETURN_IF_IERROR(bejEncodeBejReal(node, output));
+            break;
+        case bejBoolean:
+            RETURN_IF_IERROR(bejEncodeBejBool(node, output));
+            break;
+        case bejPropertyAnnotation:
+            RETURN_IF_IERROR(bejEncodeBejProAnno(node, output));
+            break;
         default:
             fprintf(stderr, "Unsupported node type: %d\n",
                     nodeInfo->format.principalDataType);