diff options
Diffstat (limited to 'library/cpp/protobuf/json/string_transform.h')
-rw-r--r-- | library/cpp/protobuf/json/string_transform.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/library/cpp/protobuf/json/string_transform.h b/library/cpp/protobuf/json/string_transform.h new file mode 100644 index 0000000000..e4b296bc01 --- /dev/null +++ b/library/cpp/protobuf/json/string_transform.h @@ -0,0 +1,111 @@ +#pragma once + +#include <library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h> +#include <util/generic/ptr.h> +#include <util/generic/refcount.h> + +namespace NProtobufJson { + class IStringTransform: public TSimpleRefCount<IStringTransform> { + public: + virtual ~IStringTransform() { + } + + /// Some transforms have special meaning. + /// For example, escape transforms cause generic JSON escaping to be turned off. + enum Type { + EscapeTransform = 0x1, + }; + + virtual int GetType() const = 0; + + /// This method is called for each string field in proto + virtual void Transform(TString& str) const = 0; + + /// This method is called for each bytes field in proto + virtual void TransformBytes(TString& str) const { + // Default behaviour is to apply string transform + return Transform(str); + } + }; + + using TStringTransformPtr = TIntrusivePtr<IStringTransform>; + + template <bool quote, bool tounicode> + class TEscapeJTransform: public IStringTransform { + public: + int GetType() const override { + return EscapeTransform; + } + + void Transform(TString& str) const override { + TString newStr; + NEscJ::EscapeJ<quote, tounicode>(str, newStr); + str = newStr; + } + }; + + class TCEscapeTransform: public IStringTransform { + public: + int GetType() const override { + return EscapeTransform; + } + + void Transform(TString& str) const override; + }; + + class TSafeUtf8CEscapeTransform: public IStringTransform { + public: + int GetType() const override { + return EscapeTransform; + } + + void Transform(TString& str) const override; + }; + + class TDoubleEscapeTransform: public IStringTransform { + public: + int GetType() const override { + return EscapeTransform; + } + + void Transform(TString& str) const override; + }; + + class TDoubleUnescapeTransform: public NProtobufJson::IStringTransform { + public: + int GetType() const override { + return NProtobufJson::IStringTransform::EscapeTransform; + } + + void Transform(TString& str) const override; + + private: + TString Unescape(const TString& str) const; + }; + + class TBase64EncodeBytesTransform: public NProtobufJson::IStringTransform { + public: + int GetType() const override { + return 0; + } + + void Transform(TString&) const override { + // Do not transform strings + } + + void TransformBytes(TString &str) const override; + }; + + class TBase64DecodeBytesTransform: public NProtobufJson::IStringTransform { + public: + int GetType() const override { + return 0; + } + + void Transform(TString&) const override { + // Do not transform strings + } + + void TransformBytes(TString &str) const override; + }; +} |