proto2json_printer.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include "json_output.h"
  3. #include <google/protobuf/descriptor.h>
  4. #include <google/protobuf/descriptor.pb.h>
  5. #include <google/protobuf/message.h>
  6. #include <util/generic/strbuf.h>
  7. #include <util/generic/string.h>
  8. namespace NProtobufJson {
  9. struct TProto2JsonConfig;
  10. class TProto2JsonPrinter {
  11. public:
  12. TProto2JsonPrinter(const TProto2JsonConfig& config);
  13. virtual ~TProto2JsonPrinter();
  14. virtual void Print(const NProtoBuf::Message& proto, IJsonOutput& json, bool closeMap = true);
  15. virtual const TProto2JsonConfig& GetConfig() const {
  16. return Config;
  17. }
  18. protected:
  19. virtual TStringBuf MakeKey(const NProtoBuf::FieldDescriptor& field);
  20. virtual void PrintField(const NProtoBuf::Message& proto,
  21. const NProtoBuf::FieldDescriptor& field,
  22. IJsonOutput& json,
  23. TStringBuf key = {});
  24. void PrintRepeatedField(const NProtoBuf::Message& proto,
  25. const NProtoBuf::FieldDescriptor& field,
  26. IJsonOutput& json,
  27. TStringBuf key = {});
  28. void PrintSingleField(const NProtoBuf::Message& proto,
  29. const NProtoBuf::FieldDescriptor& field,
  30. IJsonOutput& json,
  31. TStringBuf key = {}, bool inProtoMap = false);
  32. void PrintKeyValue(const NProtoBuf::Message& proto,
  33. IJsonOutput& json);
  34. TString MakeKey(const NProtoBuf::Message& proto,
  35. const NProtoBuf::FieldDescriptor& field);
  36. template <bool InMapContext>
  37. void PrintEnumValue(const TStringBuf& key,
  38. const NProtoBuf::EnumValueDescriptor* value,
  39. IJsonOutput& json);
  40. template <bool InMapContext>
  41. void PrintStringValue(const NProtoBuf::FieldDescriptor& field,
  42. const TStringBuf& key, const TString& value,
  43. IJsonOutput& json);
  44. template <class T>
  45. bool NeedStringifyNumber(T value) const;
  46. bool TryPrintAny(const NProtoBuf::Message& proto, IJsonOutput& json);
  47. void PrintFields(const NProtoBuf::Message& proto, IJsonOutput& json);
  48. protected:
  49. const TProto2JsonConfig& Config;
  50. TString TmpBuf;
  51. };
  52. }