Skip to content

Drift Package With Typed Data

Here you can see how to send typed data with DriftBytes and build a Drift Package with meta information in C++.

cpp/examples/payload_with_typedata.cc
#include <drift_protocol/common/data_payload.pb.h>
#include <drift_protocol/common/drift_package.pb.h>
#include <google/protobuf/util/time_util.h>
#include <drift_bytes/bytes.h>

using drift::proto::common::DataPayload;
using drift::proto::common::DriftPackage;
using drift::proto::common::StatusCode;
using drift::proto::meta::MetaInfo;
using drift::proto::meta::TypedDataInfo;

using drift_bytes::Variant;
using drift_bytes::InputBuffer;
using drift_bytes::OutputBuffer;

using google::protobuf::util::TimeUtil;
using google::protobuf::Any;

int main() {
    const auto pb_time = TimeUtil::GetCurrentTime();
    std::string message;

    const auto kData = {Variant(true), Variant(1), Variant(1.0), Variant("Hello")};
    const std::vector<std::string> kNames = {"bool", "int", "float", "string"};

    {
        // Create a package and serialize it
        DriftPackage original;
        original.set_id(TimeUtil::TimestampToMilliseconds(pb_time)); // UNIX timestamp in ms
        original.set_status(StatusCode::GOOD);
        original.mutable_source_timestamp()->CopyFrom(pb_time);
        original.mutable_publish_timestamp()->CopyFrom(pb_time);

        // Fill meta data
        TypedDataInfo info;
        for (const auto &name: kNames) {
            auto var = info.add_items();
            var->set_name(name);
            var->set_status(StatusCode::GOOD);
        }

        MetaInfo meta;
        meta.set_type(MetaInfo::TYPED_DATA);
        meta.mutable_typed_data_info()->CopyFrom(info);

        original.mutable_meta()->CopyFrom(meta);

        // Put data in buffer without decomposition and compression
        OutputBuffer buffer;
        for (const auto &data: kData) {
            buffer.push_back(data);
        }

        // Prepare payload
        DataPayload payload;
        payload.set_data(buffer.str());
        original.add_data()->PackFrom(payload);

        // Serialize package to message
        original.SerializePartialToString(&message);
    }

    // Parse the package
    DriftPackage new_package;
    new_package.ParseFromString(message);
    std::cout << "Package with ID=" << new_package.id() << " type="
              << MetaInfo::DataType_Name(new_package.meta().type()) << std::endl;

    DataPayload payload;
    new_package.data(0).UnpackTo(&payload);
    auto data = payload.data();
    auto buffer = InputBuffer(std::move(data));

    // Print data
    for (const auto &var: new_package.meta().typed_data_info().items()) {
        std::cout << var.name() << ": " << buffer.pop() << std::endl;
    }
}