2828
2929#include < nlohmann/json.hpp>
3030
31+ #include " iceberg/name_mapping.h"
3132#include " iceberg/partition_field.h"
3233#include " iceberg/partition_spec.h"
3334#include " iceberg/result.h"
@@ -71,9 +72,11 @@ constexpr std::string_view kKey = "key";
7172constexpr std::string_view kValue = " value" ;
7273constexpr std::string_view kDoc = " doc" ;
7374constexpr std::string_view kName = " name" ;
75+ constexpr std::string_view kNames = " names" ;
7476constexpr std::string_view kId = " id" ;
7577constexpr std::string_view kInitialDefault = " initial-default" ;
7678constexpr std::string_view kWriteDefault = " write-default" ;
79+ constexpr std::string_view kFieldId = " field-id" ;
7780constexpr std::string_view kElementId = " element-id" ;
7881constexpr std::string_view kKeyId = " key-id" ;
7982constexpr std::string_view kValueId = " value-id" ;
@@ -82,7 +85,6 @@ constexpr std::string_view kElementRequired = "element-required";
8285constexpr std::string_view kValueRequired = " value-required" ;
8386
8487// Snapshot constants
85- constexpr std::string_view kFieldId = " field-id" ;
8688constexpr std::string_view kSpecId = " spec-id" ;
8789constexpr std::string_view kSnapshotId = " snapshot-id" ;
8890constexpr std::string_view kParentSnapshotId = " parent-snapshot-id" ;
@@ -1232,4 +1234,80 @@ Result<std::string> ToJsonString(const nlohmann::json& json) {
12321234 }
12331235}
12341236
1237+ nlohmann::json ToJson (const MappedField& field) {
1238+ nlohmann::json json;
1239+ if (field.field_id .has_value ()) {
1240+ json[kFieldId ] = field.field_id .value ();
1241+ }
1242+
1243+ nlohmann::json names = nlohmann::json::array ();
1244+ for (const auto & name : field.names ) {
1245+ names.push_back (name);
1246+ }
1247+ json[kNames ] = names;
1248+
1249+ if (field.nested_mapping != nullptr ) {
1250+ json[kFields ] = ToJson (*field.nested_mapping );
1251+ }
1252+ return json;
1253+ }
1254+
1255+ Result<MappedField> MappedFieldFromJson (const nlohmann::json& json) {
1256+ if (!json.is_object ()) [[unlikely]] {
1257+ return JsonParseError (" Cannot parse non-object mapping field: {}" ,
1258+ SafeDumpJson (json));
1259+ }
1260+
1261+ ICEBERG_ASSIGN_OR_RAISE (std::optional<int32_t > field_id,
1262+ GetJsonValueOptional<int32_t >(json, kFieldId ));
1263+
1264+ std::vector<std::string> names;
1265+ if (json.contains (kNames )) {
1266+ ICEBERG_ASSIGN_OR_RAISE (names, GetJsonValue<std::vector<std::string>>(json, kNames ));
1267+ }
1268+
1269+ std::unique_ptr<MappedFields> nested_mapping;
1270+ if (json.contains (kFields )) {
1271+ ICEBERG_ASSIGN_OR_RAISE (auto fields_json,
1272+ GetJsonValue<nlohmann::json>(json, kFields ));
1273+ ICEBERG_ASSIGN_OR_RAISE (nested_mapping, MappedFieldsFromJson (fields_json));
1274+ }
1275+
1276+ return MappedField{.names = {names.cbegin (), names.cend ()},
1277+ .field_id = field_id,
1278+ .nested_mapping = std::move (nested_mapping)};
1279+ }
1280+
1281+ nlohmann::json ToJson (const MappedFields& mapped_fields) {
1282+ nlohmann::json array = nlohmann::json::array ();
1283+ for (const auto & field : mapped_fields.fields ()) {
1284+ array.push_back (ToJson (field));
1285+ }
1286+ return array;
1287+ }
1288+
1289+ Result<std::unique_ptr<MappedFields>> MappedFieldsFromJson (const nlohmann::json& json) {
1290+ if (!json.is_array ()) [[unlikely]] {
1291+ return JsonParseError (" Cannot parse non-array mapping fields: {}" ,
1292+ SafeDumpJson (json));
1293+ }
1294+
1295+ std::vector<MappedField> fields;
1296+ for (const auto & field_json : json) {
1297+ ICEBERG_ASSIGN_OR_RAISE (auto field, MappedFieldFromJson (field_json));
1298+ fields.push_back (std::move (field));
1299+ }
1300+
1301+ return MappedFields::Make (std::move (fields));
1302+ }
1303+
1304+ nlohmann::json ToJson (const NameMapping& name_mapping) {
1305+ return ToJson (name_mapping.AsMappedFields ());
1306+ }
1307+
1308+ Result<std::unique_ptr<NameMapping>> NameMappingFromJson (const nlohmann::json& json) {
1309+ ICEBERG_ASSIGN_OR_RAISE (auto mapped_fields, MappedFieldsFromJson (json));
1310+ return NameMapping::Make (std::move (mapped_fields));
1311+ }
1312+
12351313} // namespace iceberg
0 commit comments