blob: deb8fd57921cee645a4fdeaf039b817d33f4ff95 [file]
#include <string>
#include "absl/log/absl_check.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/message.h"
#include "google/protobuf/message_lite.h"
#include "rust/cpp_kernel/strings.h"
#include "google/protobuf/text_format.h"
extern "C" {
// Returns the full name of the message from its Descriptor.
google::protobuf::rust::PtrAndLen proto2_rust_Descriptor_full_name(
const google::protobuf::Descriptor* desc) {
ABSL_CHECK(desc != nullptr) << "Descriptor is null.";
return google::protobuf::rust::PtrAndLen{desc->full_name().data(),
desc->full_name().size()};
}
// Converts a message to its TextFormat representation.
google::protobuf::rust::RustStringRawParts proto2_rust_Message_print_to_text_format(
const google::protobuf::MessageLite* m, bool single_line, bool hide_unknown_fields) {
const auto* msg = google::protobuf::DynamicCastMessage<google::protobuf::Message>(m);
// This should always hold because the Rust API requires `WithReflection`.
ABSL_CHECK(msg != nullptr) << "Message does not support reflection.";
google::protobuf::TextFormat::Printer printer;
printer.SetSingleLineMode(single_line);
printer.SetHideUnknownFields(hide_unknown_fields);
std::string text;
ABSL_CHECK(printer.PrintToString(*msg, &text));
return google::protobuf::rust::RustStringRawParts(text);
}
// Parses a message from its TextFormat representation.
bool proto2_rust_Message_parse_from_text_format(google::protobuf::MessageLite* m,
google::protobuf::rust::PtrAndLen input) {
auto* msg = google::protobuf::DynamicCastMessage<google::protobuf::Message>(m);
// This should always hold because the Rust API requires `WithReflection`.
ABSL_CHECK(msg != nullptr) << "Message does not support reflection.";
return google::protobuf::TextFormat::ParseFromString(input.AsStringView(), msg);
}
} // extern "C"