From 1110808a9d39d4b808aef724c861a2e1a38d2a69 Mon Sep 17 00:00:00 2001
From: Devtools Arcadia <arcadia-devtools@yandex-team.ru>
Date: Mon, 7 Feb 2022 18:08:42 +0300
Subject: intermediate changes ref:cde9a383711a11544ce7e107a78147fb96cc4029

---
 library/cpp/protobuf/json/config.h | 164 +++++++++++++++++++++++++++++++++++++
 1 file changed, 164 insertions(+)
 create mode 100644 library/cpp/protobuf/json/config.h

(limited to 'library/cpp/protobuf/json/config.h')

diff --git a/library/cpp/protobuf/json/config.h b/library/cpp/protobuf/json/config.h
new file mode 100644
index 0000000000..dc84fb4d5d
--- /dev/null
+++ b/library/cpp/protobuf/json/config.h
@@ -0,0 +1,164 @@
+#pragma once
+
+#include "string_transform.h"
+#include "name_generator.h"
+
+#include <util/generic/vector.h>
+#include <util/generic/yexception.h>
+
+#include <functional>
+
+namespace NProtobufJson {
+    struct TProto2JsonConfig {
+        using TSelf = TProto2JsonConfig;
+
+        bool FormatOutput = false;
+
+        enum MissingKeyMode {
+            // Skip missing keys
+            MissingKeySkip = 0,
+            // Fill missing keys with json null value.
+            MissingKeyNull,
+            // Use default value in any case.
+            // If default value is not explicitly defined, use default type value:
+            //     i.e. 0 for integers, "" for strings
+            // For repeated keys, means []
+            MissingKeyDefault,
+            // Use default value if it is explicitly specified for optional fields.
+            // Skip if no explicitly defined default value for optional fields.
+            // Throw exception if required field is empty.
+            // For repeated keys, same as MissingKeySkip
+            MissingKeyExplicitDefaultThrowRequired
+        };
+        MissingKeyMode MissingSingleKeyMode = MissingKeySkip;
+        MissingKeyMode MissingRepeatedKeyMode = MissingKeySkip;
+
+        /// Add null value for missing fields (false by default).
+        bool AddMissingFields = false;
+
+        enum EnumValueMode {
+            EnumNumber = 0, // default
+            EnumName,
+            EnumFullName,
+            EnumNameLowerCase,
+            EnumFullNameLowerCase,
+        };
+        EnumValueMode EnumMode = EnumNumber;
+
+        enum FldNameMode {
+            FieldNameOriginalCase = 0, // default
+            FieldNameLowerCase,
+            FieldNameUpperCase,
+            FieldNameCamelCase,
+            FieldNameSnakeCase,     // ABC -> a_b_c,    UserID -> user_i_d
+            FieldNameSnakeCaseDense // ABC -> abc,      UserID -> user_id
+        };
+        FldNameMode FieldNameMode = FieldNameOriginalCase;
+
+        enum ExtFldNameMode {
+            ExtFldNameFull = 0, // default, field.full_name()
+            ExtFldNameShort // field.name()
+        };
+        ExtFldNameMode ExtensionFieldNameMode = ExtFldNameFull;
+
+        /// Use 'json_name' protobuf option for field name, mutually exclusive
+        /// with FieldNameMode.
+        bool UseJsonName = false;
+
+        /// Transforms will be applied only to string values (== protobuf fields of string / bytes type).
+        /// yajl_encode_string will be used if no transforms are specified.
+        TVector<TStringTransformPtr> StringTransforms;
+
+        /// Print map as object, otherwise print it as array of key/value objects
+        bool MapAsObject = false;
+
+        /// Stringify long integers which are not exactly representable by float or double values
+        enum EStringifyLongNumbersMode {
+            StringifyLongNumbersNever = 0, // default
+            StringifyLongNumbersForFloat,
+            StringifyLongNumbersForDouble,
+        };
+        EStringifyLongNumbersMode StringifyLongNumbers = StringifyLongNumbersNever;
+
+        /// Custom field names generator.
+        TNameGenerator NameGenerator = {};
+
+        /// Custom enum values generator.
+        TEnumValueGenerator EnumValueGenerator = {};
+
+        bool WriteNanAsString = false;
+
+        TSelf& SetFormatOutput(bool format) {
+            FormatOutput = format;
+            return *this;
+        }
+
+        TSelf& SetMissingSingleKeyMode(MissingKeyMode mode) {
+            MissingSingleKeyMode = mode;
+            return *this;
+        }
+
+        TSelf& SetMissingRepeatedKeyMode(MissingKeyMode mode) {
+            MissingRepeatedKeyMode = mode;
+            return *this;
+        }
+
+        TSelf& SetAddMissingFields(bool add) {
+            AddMissingFields = add;
+            return *this;
+        }
+
+        TSelf& SetEnumMode(EnumValueMode mode) {
+            EnumMode = mode;
+            return *this;
+        }
+
+        TSelf& SetFieldNameMode(FldNameMode mode) {
+            Y_ENSURE(mode == FieldNameOriginalCase || !UseJsonName, "FieldNameMode and UseJsonName are mutually exclusive");
+            FieldNameMode = mode;
+            return *this;
+        }
+
+        TSelf& SetUseJsonName(bool jsonName) {
+            Y_ENSURE(!jsonName || FieldNameMode == FieldNameOriginalCase, "FieldNameMode and UseJsonName are mutually exclusive");
+            UseJsonName = jsonName;
+            return *this;
+        }
+
+        TSelf& SetExtensionFieldNameMode(ExtFldNameMode mode) {
+            ExtensionFieldNameMode = mode;
+            return *this;
+        }
+
+        TSelf& AddStringTransform(TStringTransformPtr transform) {
+            StringTransforms.push_back(transform);
+            return *this;
+        }
+
+        TSelf& SetMapAsObject(bool value) {
+            MapAsObject = value;
+            return *this;
+        }
+
+        TSelf& SetStringifyLongNumbers(EStringifyLongNumbersMode stringify) {
+            StringifyLongNumbers = stringify;
+            return *this;
+        }
+
+        TSelf& SetNameGenerator(TNameGenerator callback) {
+            NameGenerator = callback;
+            return *this;
+        }
+
+        TSelf& SetEnumValueGenerator(TEnumValueGenerator callback) {
+            EnumValueGenerator = callback;
+            return *this;
+        }
+
+        TSelf& SetWriteNanAsString(bool value) {
+            WriteNanAsString = value;
+            return *this;
+        }
+    };
+
+}
-- 
cgit v1.2.3