This is an automated email from the ASF dual-hosted git repository.

gangwu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new d07b7564 feat: Add factory functions for ManifestWriter and 
ManifestListWriter (#493)
d07b7564 is described below

commit d07b7564ab170078e308c59f7ba3401be86f273f
Author: Junwang Zhao <[email protected]>
AuthorDate: Thu Jan 8 21:56:00 2026 +0800

    feat: Add factory functions for ManifestWriter and ManifestListWriter (#493)
    
    - Add ManifestWriter::MakeWriter() factory function that takes
    format_version parameter and routes to appropriate
    MakeV1Writer/MakeV2Writer/MakeV3Writer
    - Add ManifestListWriter::MakeWriter() factory function with same
    pattern
    - Update test cases to use the new factory functions instead of
    scattered if-else chains checking format_version
    - Centralizes version handling logic, making it easier to add v4, v5,
    etc. in the future
---
 src/iceberg/manifest/manifest_writer.cc           | 52 +++++++++++++++
 src/iceberg/manifest/manifest_writer.h            | 38 +++++++++++
 src/iceberg/test/delete_file_index_test.cc        | 14 +----
 src/iceberg/test/manifest_group_test.cc           | 53 ++++------------
 src/iceberg/test/manifest_list_versions_test.cc   | 26 ++------
 src/iceberg/test/manifest_reader_stats_test.cc    | 23 +------
 src/iceberg/test/manifest_reader_test.cc          | 38 +++--------
 src/iceberg/test/manifest_writer_versions_test.cc | 77 +++++------------------
 src/iceberg/test/rolling_manifest_writer_test.cc  | 36 ++---------
 9 files changed, 142 insertions(+), 215 deletions(-)

diff --git a/src/iceberg/manifest/manifest_writer.cc 
b/src/iceberg/manifest/manifest_writer.cc
index 649797fe..0899869a 100644
--- a/src/iceberg/manifest/manifest_writer.cc
+++ b/src/iceberg/manifest/manifest_writer.cc
@@ -365,6 +365,32 @@ Result<std::unique_ptr<ManifestWriter>> 
ManifestWriter::MakeV3Writer(
       std::move(writer), std::move(adapter), manifest_location, first_row_id));
 }
 
+Result<std::unique_ptr<ManifestWriter>> ManifestWriter::MakeWriter(
+    int8_t format_version, std::optional<int64_t> snapshot_id,
+    std::string_view manifest_location, std::shared_ptr<FileIO> file_io,
+    std::shared_ptr<PartitionSpec> partition_spec, std::shared_ptr<Schema> 
current_schema,
+    std::optional<ManifestContent> content, std::optional<int64_t> 
first_row_id) {
+  switch (format_version) {
+    case 1:
+      return MakeV1Writer(snapshot_id, manifest_location, std::move(file_io),
+                          std::move(partition_spec), 
std::move(current_schema));
+    case 2:
+      ICEBERG_PRECHECK(content.has_value(),
+                       "ManifestContent is required for format version 2");
+      return MakeV2Writer(snapshot_id, manifest_location, std::move(file_io),
+                          std::move(partition_spec), std::move(current_schema),
+                          content.value());
+    case 3:
+      ICEBERG_PRECHECK(content.has_value(),
+                       "ManifestContent is required for format version 3");
+      return MakeV3Writer(snapshot_id, first_row_id, manifest_location,
+                          std::move(file_io), std::move(partition_spec),
+                          std::move(current_schema), content.value());
+    default:
+      return NotSupported("Format version {} is not supported", 
format_version);
+  }
+}
+
 ManifestListWriter::ManifestListWriter(std::unique_ptr<Writer> writer,
                                        std::unique_ptr<ManifestFileAdapter> 
adapter)
     : writer_(std::move(writer)), adapter_(std::move(adapter)) {}
@@ -452,4 +478,30 @@ Result<std::unique_ptr<ManifestListWriter>> 
ManifestListWriter::MakeV3Writer(
       new ManifestListWriter(std::move(writer), std::move(adapter)));
 }
 
+Result<std::unique_ptr<ManifestListWriter>> ManifestListWriter::MakeWriter(
+    int8_t format_version, int64_t snapshot_id, std::optional<int64_t> 
parent_snapshot_id,
+    std::string_view manifest_list_location, std::shared_ptr<FileIO> file_io,
+    std::optional<int64_t> sequence_number, std::optional<int64_t> 
first_row_id) {
+  switch (format_version) {
+    case 1:
+      return MakeV1Writer(snapshot_id, parent_snapshot_id, 
manifest_list_location,
+                          std::move(file_io));
+    case 2:
+      ICEBERG_PRECHECK(sequence_number.has_value(),
+                       "Sequence number is required for format version 2");
+      return MakeV2Writer(snapshot_id, parent_snapshot_id, 
sequence_number.value(),
+                          manifest_list_location, std::move(file_io));
+    case 3:
+      ICEBERG_PRECHECK(sequence_number.has_value(),
+                       "Sequence number is required for format version 3");
+      ICEBERG_PRECHECK(first_row_id.has_value(),
+                       "First row ID is required for format version 3");
+      return MakeV3Writer(snapshot_id, parent_snapshot_id, 
sequence_number.value(),
+                          first_row_id.value(), manifest_list_location,
+                          std::move(file_io));
+    default:
+      return NotSupported("Format version {} is not supported", 
format_version);
+  }
+}
+
 }  // namespace iceberg
diff --git a/src/iceberg/manifest/manifest_writer.h 
b/src/iceberg/manifest/manifest_writer.h
index 6f468240..5a095b28 100644
--- a/src/iceberg/manifest/manifest_writer.h
+++ b/src/iceberg/manifest/manifest_writer.h
@@ -158,6 +158,26 @@ class ICEBERG_EXPORT ManifestWriter {
       std::shared_ptr<PartitionSpec> partition_spec,
       std::shared_ptr<Schema> current_schema, ManifestContent content);
 
+  /// \brief Factory function to create a writer for a manifest file based on 
format
+  /// version.
+  /// \param format_version The format version (1, 2, 3, etc.).
+  /// \param snapshot_id ID of the snapshot.
+  /// \param manifest_location Path to the manifest file.
+  /// \param file_io File IO implementation to use.
+  /// \param partition_spec Partition spec for the manifest.
+  /// \param current_schema Schema containing the source fields referenced by 
partition
+  /// spec.
+  /// \param content Content of the manifest (required for format_version >= 
2).
+  /// \param first_row_id First row ID of the snapshot (required for 
format_version >= 3).
+  /// \return A Result containing the writer or an error.
+  static Result<std::unique_ptr<ManifestWriter>> MakeWriter(
+      int8_t format_version, std::optional<int64_t> snapshot_id,
+      std::string_view manifest_location, std::shared_ptr<FileIO> file_io,
+      std::shared_ptr<PartitionSpec> partition_spec,
+      std::shared_ptr<Schema> current_schema,
+      std::optional<ManifestContent> content = std::nullopt,
+      std::optional<int64_t> first_row_id = std::nullopt);
+
  private:
   // Private constructor for internal use only, use the static Make*Writer 
methods
   // instead.
@@ -240,6 +260,24 @@ class ICEBERG_EXPORT ManifestListWriter {
       int64_t sequence_number, int64_t first_row_id,
       std::string_view manifest_list_location, std::shared_ptr<FileIO> 
file_io);
 
+  /// \brief Factory function to create a writer for the manifest list based 
on format
+  /// version.
+  /// \param format_version The format version (1, 2, 3, etc.).
+  /// \param snapshot_id ID of the snapshot.
+  /// \param parent_snapshot_id ID of the parent snapshot.
+  /// \param manifest_list_location Path to the manifest list file.
+  /// \param file_io File IO implementation to use.
+  /// \param sequence_number Sequence number of the snapshot (required for 
format_version
+  /// >= 2).
+  /// \param first_row_id First row ID of the snapshot (required for 
format_version >= 3).
+  /// \return A Result containing the writer or an error.
+  static Result<std::unique_ptr<ManifestListWriter>> MakeWriter(
+      int8_t format_version, int64_t snapshot_id,
+      std::optional<int64_t> parent_snapshot_id, std::string_view 
manifest_list_location,
+      std::shared_ptr<FileIO> file_io,
+      std::optional<int64_t> sequence_number = std::nullopt,
+      std::optional<int64_t> first_row_id = std::nullopt);
+
  private:
   // Private constructor for internal use only, use the static Make*Writer 
methods
   // instead.
diff --git a/src/iceberg/test/delete_file_index_test.cc 
b/src/iceberg/test/delete_file_index_test.cc
index cf75fe2d..d5866e27 100644
--- a/src/iceberg/test/delete_file_index_test.cc
+++ b/src/iceberg/test/delete_file_index_test.cc
@@ -165,17 +165,9 @@ class DeleteFileIndexTest : public 
testing::TestWithParam<int> {
                                    std::shared_ptr<PartitionSpec> spec) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 2) {
-      writer_result = ManifestWriter::MakeV2Writer(
-          snapshot_id, manifest_path, file_io_, spec, schema_, 
ManifestContent::kDeletes);
-    } else if (format_version == 3) {
-      writer_result = ManifestWriter::MakeV3Writer(
-          snapshot_id, /*first_row_id=*/std::nullopt, manifest_path, file_io_, 
spec,
-          schema_, ManifestContent::kDeletes);
-    }
+    auto writer_result = ManifestWriter::MakeWriter(
+        format_version, snapshot_id, manifest_path, file_io_, spec, schema_,
+        ManifestContent::kDeletes, /*first_row_id=*/std::nullopt);
 
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
diff --git a/src/iceberg/test/manifest_group_test.cc 
b/src/iceberg/test/manifest_group_test.cc
index c7655342..2a062c9e 100644
--- a/src/iceberg/test/manifest_group_test.cc
+++ b/src/iceberg/test/manifest_group_test.cc
@@ -135,21 +135,10 @@ class ManifestGroupTest : public 
testing::TestWithParam<int> {
                                  std::shared_ptr<PartitionSpec> spec) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestWriter::MakeV1Writer(snapshot_id, manifest_path, 
file_io_,
-                                                   spec, schema_);
-    } else if (format_version == 2) {
-      writer_result = ManifestWriter::MakeV2Writer(snapshot_id, manifest_path, 
file_io_,
-                                                   spec, schema_, 
ManifestContent::kData);
-    } else if (format_version == 3) {
-      writer_result =
-          ManifestWriter::MakeV3Writer(snapshot_id, /*first_row_id=*/0L, 
manifest_path,
-                                       file_io_, spec, schema_, 
ManifestContent::kData);
-    }
-
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, snapshot_id, manifest_path, 
file_io_,
+                                   spec, schema_, ManifestContent::kData,
+                                   /*first_row_id=*/0L);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -168,18 +157,10 @@ class ManifestGroupTest : public 
testing::TestWithParam<int> {
                                    std::shared_ptr<PartitionSpec> spec) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 2) {
-      writer_result = ManifestWriter::MakeV2Writer(
-          snapshot_id, manifest_path, file_io_, spec, schema_, 
ManifestContent::kDeletes);
-    } else if (format_version == 3) {
-      writer_result = ManifestWriter::MakeV3Writer(
-          snapshot_id, /*first_row_id=*/std::nullopt, manifest_path, file_io_, 
spec,
-          schema_, ManifestContent::kDeletes);
-    }
-
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, snapshot_id, manifest_path, 
file_io_,
+                                   spec, schema_, ManifestContent::kDeletes,
+                                   /*first_row_id=*/std::nullopt);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -213,21 +194,9 @@ class ManifestGroupTest : public 
testing::TestWithParam<int> {
     constexpr int64_t kParentSnapshotId = 0L;
     constexpr int64_t kSnapshotFirstRowId = 0L;
 
-    Result<std::unique_ptr<ManifestListWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestListWriter::MakeV1Writer(snapshot_id, 
kParentSnapshotId,
-                                                       manifest_list_path, 
file_io_);
-    } else if (format_version == 2) {
-      writer_result = ManifestListWriter::MakeV2Writer(
-          snapshot_id, kParentSnapshotId, sequence_number, manifest_list_path, 
file_io_);
-    } else if (format_version == 3) {
-      writer_result = ManifestListWriter::MakeV3Writer(
-          snapshot_id, kParentSnapshotId, sequence_number, kSnapshotFirstRowId,
-          manifest_list_path, file_io_);
-    }
-
+    auto writer_result = ManifestListWriter::MakeWriter(
+        format_version, snapshot_id, kParentSnapshotId, manifest_list_path, 
file_io_,
+        sequence_number, kSnapshotFirstRowId);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
     EXPECT_THAT(writer->Add(manifest), IsOk());
diff --git a/src/iceberg/test/manifest_list_versions_test.cc 
b/src/iceberg/test/manifest_list_versions_test.cc
index 9c32a59d..f7049fad 100644
--- a/src/iceberg/test/manifest_list_versions_test.cc
+++ b/src/iceberg/test/manifest_list_versions_test.cc
@@ -108,21 +108,9 @@ class TestManifestListVersions : public ::testing::Test {
     const std::string manifest_list_path = CreateManifestListPath();
     constexpr int64_t kParentSnapshotId = kSnapshotId - 1;
 
-    Result<std::unique_ptr<ManifestListWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestListWriter::MakeV1Writer(kSnapshotId, 
kParentSnapshotId,
-                                                       manifest_list_path, 
file_io_);
-    } else if (format_version == 2) {
-      writer_result = ManifestListWriter::MakeV2Writer(
-          kSnapshotId, kParentSnapshotId, kSeqNum, manifest_list_path, 
file_io_);
-    } else if (format_version == 3) {
-      writer_result = ManifestListWriter::MakeV3Writer(kSnapshotId, 
kParentSnapshotId,
-                                                       kSeqNum, 
kSnapshotFirstRowId,
-                                                       manifest_list_path, 
file_io_);
-    }
-
+    auto writer_result = ManifestListWriter::MakeWriter(
+        format_version, kSnapshotId, kParentSnapshotId, manifest_list_path, 
file_io_,
+        kSeqNum, kSnapshotFirstRowId);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -202,11 +190,9 @@ class TestManifestListVersions : public ::testing::Test {
 TEST_F(TestManifestListVersions, TestV1WriteDeleteManifest) {
   const std::string manifest_list_path = CreateManifestListPath();
 
-  auto writer_result = ManifestListWriter::MakeV1Writer(kSnapshotId, 
kSnapshotId - 1,
-                                                        manifest_list_path, 
file_io_);
-  EXPECT_THAT(writer_result, IsOk());
-
-  auto writer = std::move(writer_result.value());
+  ICEBERG_UNWRAP_OR_FAIL(auto writer,
+                         ManifestListWriter::MakeV1Writer(kSnapshotId, 
kSnapshotId - 1,
+                                                          manifest_list_path, 
file_io_));
   auto status = writer->Add(kDeleteManifest);
 
   EXPECT_THAT(status, IsError(ErrorKind::kInvalidManifestList));
diff --git a/src/iceberg/test/manifest_reader_stats_test.cc 
b/src/iceberg/test/manifest_reader_stats_test.cc
index 327da225..d1da1795 100644
--- a/src/iceberg/test/manifest_reader_stats_test.cc
+++ b/src/iceberg/test/manifest_reader_stats_test.cc
@@ -89,26 +89,9 @@ class TestManifestReaderStats : public 
testing::TestWithParam<int> {
   ManifestFile WriteManifest(int format_version, std::unique_ptr<DataFile> 
data_file) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    switch (format_version) {
-      case 1:
-        writer_result = ManifestWriter::MakeV1Writer(/*snapshot_id=*/1000L, 
manifest_path,
-                                                     file_io_, spec_, schema_);
-        break;
-      case 2:
-        writer_result =
-            ManifestWriter::MakeV2Writer(/*snapshot_id=*/1000L, manifest_path, 
file_io_,
-                                         spec_, schema_, 
ManifestContent::kData);
-        break;
-      case 3:
-        writer_result = ManifestWriter::MakeV3Writer(
-            /*snapshot_id=*/1000L, /*sequence_number=*/0L, manifest_path, 
file_io_, spec_,
-            schema_, ManifestContent::kData);
-        break;
-    }
-
+    auto writer_result = ManifestWriter::MakeWriter(
+        format_version, /*snapshot_id=*/1000L, manifest_path, file_io_, spec_, 
schema_,
+        ManifestContent::kData, /*first_row_id=*/0L);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
diff --git a/src/iceberg/test/manifest_reader_test.cc 
b/src/iceberg/test/manifest_reader_test.cc
index e8a1a511..7604eba9 100644
--- a/src/iceberg/test/manifest_reader_test.cc
+++ b/src/iceberg/test/manifest_reader_test.cc
@@ -82,24 +82,10 @@ class TestManifestReader : public 
testing::TestWithParam<int> {
                              const std::vector<ManifestEntry>& entries) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    switch (format_version) {
-      case 1:
-        writer_result = ManifestWriter::MakeV1Writer(snapshot_id, 
manifest_path, file_io_,
-                                                     spec_, schema_);
-        break;
-      case 2:
-        writer_result = ManifestWriter::MakeV2Writer(
-            snapshot_id, manifest_path, file_io_, spec_, schema_, 
ManifestContent::kData);
-        break;
-      case 3:
-        writer_result = ManifestWriter::MakeV3Writer(snapshot_id, 
/*first_row_id=*/0L,
-                                                     manifest_path, file_io_, 
spec_,
-                                                     schema_, 
ManifestContent::kData);
-        break;
-    }
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, snapshot_id, manifest_path, 
file_io_,
+                                   spec_, schema_, ManifestContent::kData,
+                                   /*first_row_id=*/0L);
 
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
@@ -152,18 +138,10 @@ class TestManifestReader : public 
testing::TestWithParam<int> {
                                    std::vector<ManifestEntry> entries) {
     const std::string manifest_path = MakeManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 2) {
-      writer_result =
-          ManifestWriter::MakeV2Writer(snapshot_id, manifest_path, file_io_, 
spec_,
-                                       schema_, ManifestContent::kDeletes);
-    } else if (format_version == 3) {
-      writer_result = ManifestWriter::MakeV3Writer(
-          snapshot_id, /*first_row_id=*/std::nullopt, manifest_path, file_io_, 
spec_,
-          schema_, ManifestContent::kDeletes);
-    }
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, snapshot_id, manifest_path, 
file_io_,
+                                   spec_, schema_, ManifestContent::kDeletes,
+                                   /*first_row_id=*/std::nullopt);
 
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
diff --git a/src/iceberg/test/manifest_writer_versions_test.cc 
b/src/iceberg/test/manifest_writer_versions_test.cc
index e3229fc7..70d00504 100644
--- a/src/iceberg/test/manifest_writer_versions_test.cc
+++ b/src/iceberg/test/manifest_writer_versions_test.cc
@@ -161,21 +161,9 @@ class ManifestWriterVersionsTest : public ::testing::Test {
     const std::string manifest_list_path = CreateManifestListPath();
     constexpr int64_t kParentSnapshotId = kSnapshotId - 1;
 
-    Result<std::unique_ptr<ManifestListWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestListWriter::MakeV1Writer(kSnapshotId, 
kParentSnapshotId,
-                                                       manifest_list_path, 
file_io_);
-    } else if (format_version == 2) {
-      writer_result = ManifestListWriter::MakeV2Writer(
-          kSnapshotId, kParentSnapshotId, kSequenceNumber, manifest_list_path, 
file_io_);
-    } else if (format_version == 3) {
-      writer_result = ManifestListWriter::MakeV3Writer(kSnapshotId, 
kParentSnapshotId,
-                                                       kSequenceNumber, 
kFirstRowId,
-                                                       manifest_list_path, 
file_io_);
-    }
-
+    auto writer_result = ManifestListWriter::MakeWriter(
+        format_version, kSnapshotId, kParentSnapshotId, manifest_list_path, 
file_io_,
+        kSequenceNumber, kFirstRowId);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -210,21 +198,9 @@ class ManifestWriterVersionsTest : public ::testing::Test {
                              std::vector<std::shared_ptr<DataFile>> 
data_files) {
     const std::string manifest_path = CreateManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestWriter::MakeV1Writer(kSnapshotId, manifest_path, 
file_io_,
-                                                   spec_, schema_);
-    } else if (format_version == 2) {
-      writer_result = ManifestWriter::MakeV2Writer(
-          kSnapshotId, manifest_path, file_io_, spec_, schema_, 
ManifestContent::kData);
-    } else if (format_version == 3) {
-      writer_result =
-          ManifestWriter::MakeV3Writer(kSnapshotId, kFirstRowId, 
manifest_path, file_io_,
-                                       spec_, schema_, ManifestContent::kData);
-    }
-
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, kSnapshotId, manifest_path, 
file_io_,
+                                   spec_, schema_, ManifestContent::kData, 
kFirstRowId);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -255,18 +231,9 @@ class ManifestWriterVersionsTest : public ::testing::Test {
                                    std::shared_ptr<DataFile> delete_file) {
     const std::string manifest_path = CreateManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 2) {
-      writer_result =
-          ManifestWriter::MakeV2Writer(kSnapshotId, manifest_path, file_io_, 
spec_,
-                                       schema_, ManifestContent::kDeletes);
-    } else if (format_version == 3) {
-      writer_result =
-          ManifestWriter::MakeV3Writer(kSnapshotId, kFirstRowId, 
manifest_path, file_io_,
-                                       spec_, schema_, 
ManifestContent::kDeletes);
-    }
+    auto writer_result = ManifestWriter::MakeWriter(
+        format_version, kSnapshotId, manifest_path, file_io_, spec_, schema_,
+        ManifestContent::kDeletes, kFirstRowId);
 
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
@@ -286,21 +253,9 @@ class ManifestWriterVersionsTest : public ::testing::Test {
 
     const std::string manifest_path = CreateManifestPath();
 
-    Result<std::unique_ptr<ManifestWriter>> writer_result =
-        NotSupported("Format version: {}", format_version);
-
-    if (format_version == 1) {
-      writer_result = ManifestWriter::MakeV1Writer(kSnapshotId, manifest_path, 
file_io_,
-                                                   spec_, schema_);
-    } else if (format_version == 2) {
-      writer_result = ManifestWriter::MakeV2Writer(kSnapshotId, manifest_path, 
file_io_,
-                                                   spec_, schema_, 
old_manifest.content);
-    } else if (format_version == 3) {
-      writer_result =
-          ManifestWriter::MakeV3Writer(kSnapshotId, kFirstRowId, 
manifest_path, file_io_,
-                                       spec_, schema_, old_manifest.content);
-    }
-
+    auto writer_result =
+        ManifestWriter::MakeWriter(format_version, kSnapshotId, manifest_path, 
file_io_,
+                                   spec_, schema_, old_manifest.content, 
kFirstRowId);
     EXPECT_THAT(writer_result, IsOk());
     auto writer = std::move(writer_result.value());
 
@@ -466,11 +421,9 @@ TEST_F(ManifestWriterVersionsTest, TestV1Write) {
 
 TEST_F(ManifestWriterVersionsTest, TestV1WriteDelete) {
   const std::string manifest_path = CreateManifestPath();
-  auto writer_result =
-      ManifestWriter::MakeV1Writer(kSnapshotId, manifest_path, file_io_, 
spec_, schema_);
-
-  EXPECT_THAT(writer_result, IsOk());
-  auto writer = std::move(writer_result.value());
+  ICEBERG_UNWRAP_OR_FAIL(
+      auto writer,
+      ManifestWriter::MakeV1Writer(kSnapshotId, manifest_path, file_io_, 
spec_, schema_));
 
   ManifestEntry entry;
   entry.snapshot_id = kSnapshotId;
diff --git a/src/iceberg/test/rolling_manifest_writer_test.cc 
b/src/iceberg/test/rolling_manifest_writer_test.cc
index 8ea13869..439359bc 100644
--- a/src/iceberg/test/rolling_manifest_writer_test.cc
+++ b/src/iceberg/test/rolling_manifest_writer_test.cc
@@ -109,22 +109,9 @@ class RollingManifestWriterTest : public 
::testing::TestWithParam<int32_t> {
       int32_t format_version) {
     return [this, format_version]() -> Result<std::unique_ptr<ManifestWriter>> 
{
       const std::string manifest_path = CreateManifestPath();
-      Result<std::unique_ptr<ManifestWriter>> writer_result =
-          NotSupported("Format version: {}", format_version);
-
-      if (format_version == 1) {
-        writer_result = ManifestWriter::MakeV1Writer(kSnapshotId, 
manifest_path, file_io_,
-                                                     spec_, schema_);
-      } else if (format_version == 2) {
-        writer_result = ManifestWriter::MakeV2Writer(
-            kSnapshotId, manifest_path, file_io_, spec_, schema_, 
ManifestContent::kData);
-      } else if (format_version == 3) {
-        writer_result = ManifestWriter::MakeV3Writer(kSnapshotId, kFirstRowId,
-                                                     manifest_path, file_io_, 
spec_,
-                                                     schema_, 
ManifestContent::kData);
-      }
-
-      return writer_result;
+      return ManifestWriter::MakeWriter(format_version, kSnapshotId, 
manifest_path,
+                                        file_io_, spec_, schema_, 
ManifestContent::kData,
+                                        kFirstRowId);
     };
   }
 
@@ -132,20 +119,9 @@ class RollingManifestWriterTest : public 
::testing::TestWithParam<int32_t> {
       int32_t format_version) {
     return [this, format_version]() -> Result<std::unique_ptr<ManifestWriter>> 
{
       const std::string manifest_path = CreateManifestPath();
-      Result<std::unique_ptr<ManifestWriter>> writer_result =
-          NotSupported("Format version: {}", format_version);
-
-      if (format_version == 2) {
-        writer_result =
-            ManifestWriter::MakeV2Writer(kSnapshotId, manifest_path, file_io_, 
spec_,
-                                         schema_, ManifestContent::kDeletes);
-      } else if (format_version == 3) {
-        writer_result = ManifestWriter::MakeV3Writer(kSnapshotId, kFirstRowId,
-                                                     manifest_path, file_io_, 
spec_,
-                                                     schema_, 
ManifestContent::kDeletes);
-      }
-
-      return writer_result;
+      return ManifestWriter::MakeWriter(format_version, kSnapshotId, 
manifest_path,
+                                        file_io_, spec_, schema_,
+                                        ManifestContent::kDeletes, 
kFirstRowId);
     };
   }
 

Reply via email to