diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/protobuf/json/config.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/protobuf/json/config.h')
-rw-r--r-- | library/cpp/protobuf/json/config.h | 164 |
1 files changed, 164 insertions, 0 deletions
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; + } + }; + +} |